如何在ASP.NET MVC postback控制器操作中访问hiddenField的值?

5

我们能否直接在MVC回发控制器操作中访问asp:Label的值?我还想知道如何在ASP.NET MVC回发控制器操作中访问hiddenField的值。

2个回答

18
在ASP.NET MVC中,你不使用<asp:...标记,但是你可以将任意数量的输入提交到控制器操作中的一个表单中,其中一个CustomViewModel类可以绑定数据并让你进一步操作它。
public class CustomViewModel
{
    public string textbox1 { get; set; }
    public int textbox2 { get; set; }
    public string hidden1 { get; set; }
}
例如,如果你在MVC 3中使用Razor语法,你的视图可能看起来像这样:
@using (Html.BeginForm())
{
    Name:
    <input type="text" name="textbox1" />
    Age:
    <input type="text" name="textbox2" />
    <input type="hidden" name="hidden1" value="hidden text" />
    <input type="submit" value="Submit" />
}

然后在你的控制器操作中,这个数据会自动绑定到你的 ViewModel 类中,假设它叫 Save,可能如下所示:

[HttpPost]
public ActionResult Save(CustomViewModel vm)
{
    string name = vm.textbox1;
    int age = vm.textbox2;
    string hiddenText = vm.hidden1;
    // do something useful with this data
    return View("ModelSaved");
}

2
据我所知,应该鼓励使用视图模型而不是FormCollection。 - James Hulse
@havok:修改了答案以加强视图模型。 - David Fox
现在这是一个很棒的答案 +1 - James Hulse
感谢您提供的出色解决方案。 - Amir978

4
在ASP.NET MVC中,不应使用诸如asp:Label之类的服务器端控件,因为它们依赖于ViewState和PostBack,而这些概念在ASP.NET MVC中已经不存在。因此,您可以使用HTML帮助程序来生成输入字段。例如:
<% using (Html.BeginForm()) { %>
    <%= Html.LabelFor(x => x.Foo)
    <%= Html.HiddenFor(x => x.Foo)
    <input type="submit" value="OK" />
<% } %>

并且需要一个控制器动作来接收该POST请求:

[HttpPost]
public ActionResult Index(SomeViewModel model)
{
    // model.Foo will contain the hidden field value here
    ...
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接