Fra*_*ers 19 html c# model-view-controller asp.net-mvc asp.net-mvc-3
我很确定我在这里做错了什么.在过去的两个月里,我们一直在使用MVC和Razor开发一个Web应用程序,我们从未想过使用表单元素.现在已经完成了母版页和子页面的大量工作,这意味着重构我们的大部分代码以便使用表单元素,这将导致页面上的多个表单元素.
除此之外,在Asp.Net中,如果我想访问后面的C#代码中的任何控件,我可以给它一个ID ="SomeID"和一个RUNAT ="SERVER".然后在我的代码后面我可以设置它的值和属性.
当我在Razor中执行此操作时,我们使用以下行:
<input id="hiddenPostBack" runat="server" type="hidden" />
Run Code Online (Sandbox Code Playgroud)
为什么我不能在控制器中访问它?我想检测回发并将值设置为false,如果它是第一次加载页面,如果没有,则将值设置为true.然后基于此,我将在服务器端或客户端读取它并做一些事情.
我真正的问题是,如果我没有表单元素,我如何在服务器端和客户端"做某事".我的印象是,如果我想将值从客户端传递到服务器并返回,最简单的方法是使用隐藏输入.但我只是没有通过MVC3和剃刀来实现这一目标.
在此先感谢您的帮助.
Ste*_*wen 37
从WebForms迁移到MVC需要在逻辑和大脑过程中进行彻底的改变.您不再需要与服务器端和客户端的"表单"进行交互(实际上即使使用WebForms,您也没有与客户端进行交互).你可能只是想到了一些想法,在WebForms中,RUNAT="SERVER"
你只是在与网页的构建进行交互.
MVC有点类似,因为您在构建模型时需要服务器端代码(构建用户将看到的数据),但是一旦构建了HTML,您就需要了解服务器和用户之间的链接不复存在.他们有一页HTML,就是这样.
因此,您构建的HTML是只读的.您将模型传递到Razor页面,该页面将构建适合该模型的HTML.
如果你想拥有一个设置为true或false的隐藏元素,这取决于这是否是第一个视图,你需要在模型中使用bool,并在Action中将其设置为True,如果它是为了响应跟进.这可以通过根据请求是[HttpGet]还是[HttpPost]进行不同的操作来完成(如果这适合您设置表单的方式:第一次访问的GET请求和提交表单时的POST请求).
或者,模型可以在创建时设置为True(这将是您第一次访问页面),但是在将值检查为True或False之后(因为bool在实例化时默认为False).然后使用:
@Html.HiddenFor(x => x.HiddenPostBack)
Run Code Online (Sandbox Code Playgroud)
在你的形式,这将隐藏真实.当表单回发到您的服务器时,模型现在将该值设置为True.
很难提供更多的建议,因为你的问题没有具体说明你为什么要这样做.您可以阅读一本关于从WebForms迁移到MVC的好书,例如Steve Sanderson的Pro ASP.NET MVC.
如果您使用的是Razor,则无法直接访问该字段,但您可以管理其值.
我们的想法是,第一种Microsoft方法驱使开发人员远离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; }
}
Run Code Online (Sandbox Code Playgroud)
这是控制器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);
}
Run Code Online (Sandbox Code Playgroud)
视图如下
//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 ...
Run Code Online (Sandbox Code Playgroud)
ViewBag的视图:
// ... Some Other Code ...
@using(Html.BeginForm()) // Creates <form>
{
Html.Hidden(
"HiddenName",
ViewBag.MyHiddenInputValue,
new { @class = "hiddencss", maxlength = 255 /*, etc... */ }
);
}
// ... Some Other Code ...
Run Code Online (Sandbox Code Playgroud)
我们使用Html Helper渲染隐藏字段,或者我们也可以手工编写它<input name=".." id=".." value="ViewBag.MyHiddenInputValue">
.
ViewBag是视图的某种数据载体.它不会限制你的模特 - 你可以放置你喜欢的任何东西.