MVC Razor隐藏输入和传递值

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.

  • 我同意,我确实需要一本好书.然而,我们在第一次发布时只是想尽快得到一些东西,正如所解释的那样,重写页面以正确使用表单目前是不实际的,但后来它将是明确的.你所建议的东西比我在某种程度上看到的要好,但它仍然需要在视图页面上为每个控件采用模型和控制器/动作结果.我使用下拉组合框发布回来,点击复选框或收音机的事件,偶尔按钮.但是javascript处理重定向.谢谢你的建议. (2认同)

Rol*_*ice 8

如果您使用的是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是视图的某种数据载体.它不会限制你的模特 - 你可以放置你喜欢的任何东西.