我敢肯定,我错在这里做一些事情。 在过去的2个月中,我们一直在开发使用MVC和剃刀web应用程序,我们从来没有想过使用表单元素。 现在这么多已经与母版页,它意味着重组我们的大部分代码才能使用表单元素和将导致页面上的多个表单元素子页面完成。
这且不说,在Asp.Net如果我想访问的C#代码的任何控制后面我可能只是给它一个ID =“SomeID”和RUNAT =“SERVER”。 然后在我后面的代码,我可以将其值设置和属性。
当我这样做是剃刀,我们使用像行:
<input id="hiddenPostBack" runat="server" type="hidden" />
为什么我不能访问该控制器? 我想检测回发并将其值设置为false,如果它是第一次加载页面,如果没有,则该值设置为true。 然后在此基础上,我会读它无论是服务器端或客户端,做一些事情。
我真正的问题是,我怎么“做什么”因为我没有一个表单元素包括服务器端和客户端。 我的印象是,如果我想从客户端值传递到服务器和背部,要做到这一点最简单的方法是用一个隐藏的输入下。 但我只是没有得到如何与MVC3和剃刀做到这一点。
在此先感谢您的帮助。
从WebForms的MVC的一招,需要在逻辑和大脑过程完整的巨变。 你不再与“形式”两个服务器端和客户端的交互(事实上,即使你的WebForms没有交互客户端)。 你可能只是混了个位,且WebForms和思维存在,在的RUNAT="SERVER"
你只是与网页建设互动。
MVC是在有点类似你有服务器端代码中建立模型(你需要建立你的用户会看到什么数据),但一旦你已经建立了HTML,你需要认识到,在服务器和用户之间的联系不复存在。 他们有HTML的页面,仅此而已。
所以,你正在构建的HTML是只读的 。 您可以通过给剃刀页面,该页面将建立HTML适用于该模型通过模型。
如果你想拥有这台true或false取决于这是否是第一个视图或者不是你需要在你的模型中的布尔,并将其设置为True行动,如果它在响应跟进一个隐藏的元素。 这可以通过根据该请求是否是不同的动作有做[HTTPGET]或[HttpPost](如果这是适合你如何设置形式:第一个访问,如果提交表单POST请求的GET请求)。
另外,它在创建时的模型可以设置为True(这将是您访问的页面的第一次),但经过检查你的价值为true或false(因为一个布尔值默认为False时,它的实例化)。 然后使用:
@Html.HiddenFor(x => x.HiddenPostBack)
在您的形式,这将会把一个隐藏的真实。 当窗体回发到服务器的模型现在有一个值设置为True。
很难给出更多的建议比你的问题是不特定的, 为什么你想这样做。 你从的WebForms,如史蒂夫·桑德森的Pro ASP.NET MVC转移到MVC读一本好书这也许是至关重要的。
如果您使用的剃须刀,你不能直接访问现场,但你可以管理它的价值。
我们的想法是第一微软的做法从Web开发带动开发商路程,很容易让桌面程序员(例如)使Web应用程序。
同时,Web开发人员,不理解ASP.NET的这个棘手的奇怪的方式。
其实这个隐藏输入呈现在客户端,和ASP无法对其进行访问(它从未有过)。 然而,在时间,你会看到它的一个海盗的方式,你可以依靠它,当你得到它使用。 Web开发不同于桌面或移动。
该模型是你的逻辑单元,以及隐藏字段(和整个视图)是数据的只是一个代表性的观点。 所以,你可以奉献上的应用程序或域的逻辑你的工作,并认为单纯只是它服务于消费者 - 这意味着你需要在视图中没有详细的访问和“头脑风暴”的功能。
控制器实际上并工作,你需要管理隐藏的或一般的设置。 该模型提供特定的逻辑单元的属性和功能和图只是它呈现给最终用户,简单地说。 了解更多关于MVC 。
模型
public class MyClassModel
{
public int Id { get; set; }
public string Name { get; set; }
public string MyPropertyForHidden { get; set; }
}
这是控制器aciton
public ActionResult MyPageView()
{
MyClassModel model = new MyClassModel(); // Single entity, strongly-typed
// IList model = new List<MyClassModel>(); // or List, strongly-typed
// ViewBag.MyHiddenInputValue = "Something to pass"; // ...or using ViewBag
return View(model);
}
该视图是下面
//This will make a Model property of the View to be of MyClassModel
@model MyNamespace.Models.MyClassModel // strongly-typed view
// @model IList<MyNamespace.Models.MyClassModel> // list, strongly-typed view
// ... Some Other Code ...
@using(Html.BeginForm()) // Creates <form>
{
// Renders hidden field for your model property (strongly-typed)
// The field rendered to server your model property (Address, Phone, etc.)
Html.HiddenFor(model => Model.MyPropertyForHidden);
// For list you may use foreach on Model
// foreach(var item in Model) or foreach(MyClassModel item in Model)
}
// ... Some Other Code ...
与ViewBag的观点:
// ... Some Other Code ...
@using(Html.BeginForm()) // Creates <form>
{
Html.Hidden(
"HiddenName",
ViewBag.MyHiddenInputValue,
new { @class = "hiddencss", maxlength = 255 /*, etc... */ }
);
}
// ... Some Other Code ...
我们正在使用的HTML帮助呈现隐藏字段,或者我们可以手工编写了- <input name=".." id=".." value="ViewBag.MyHiddenInputValue">
也。
所述ViewBag是某种数据载体向视图。 它不与模型限制你 - 你可以把任何你喜欢的。
正如你可能已经想通,Asp.Net MVC是一个不同的模式比Asp.Net(web表单)。 服务器和客户端之间的访问表单元素和采取Asp.Net MVC不同的方法。
你可以谷歌更多的阅读材料,在这个网站上。 现在,我会建议使用Ajax GET或POST数据到服务器。 你仍然可以使用input type="hidden"
,而是从一个值初始化它ViewData
或剃刀, ViewBag
。
例如,您的控制器可能是这样的:
public ActionResult Index()
{
ViewBag.MyInitialValue = true;
return View();
}
在你看来,你可以有一个由你的价值初始化的输入elemet ViewBag
:
<input type="hidden" name="myHiddenInput" id="myHiddenInput" value="@ViewBag.MyInitialValue" />
然后,你可以通过AJAX通过客户端和服务器之间的数据。 例如,使用jQuery:
$.get('GetMyNewValue?oldValue=' + $('#myHiddenInput').val(), function (e) {
// blah
});
您也可以使用$.ajax
, $.getJSON
, $.post
根据您的要求。
所有的ASP.NET MVC的第一个不相同的方式工作的WebForms一样。 您没有整个runat="server"
的事情。 MVC不提供该的WebForms提供的抽象层。 Probabaly你应该尝试了解控制器和动作,然后你应该看看模型绑定。 关于MVC任何初学者水平教程介绍了如何在客户端和服务器之间传递数据。
你做错了,因为你试图在MVC应用程序映射的WebForms。
有在MVC没有服务器端controlls。 只有查看和后端的控制器 。 您可以从服务器与模型视图的初始化方式将数据发送到客户端。
这是发生在HTTP GET请求,你的资源。
[HttpGet]
public ActionResult Home()
{
var model = new HomeModel { Greeatings = "Hi" };
return View(model);
}
您可以从客户端通过发布数据到服务器的方式将数据发送到服务器。 要做到这一点,您将创建视图和内部形式[HttpPost]
在控制器的处理程序。
// View
@using (Html.BeginForm()) {
@Html.TextBoxFor(m => m.Name)
@Html.TextBoxFor(m => m.Password)
}
// Controller
[HttpPost]
public ActionResult Home(LoginModel model)
{
// do auth.. and stuff
return Redirect();
}