ASP.NET MVC2表单元素名称

时间:2011-08-20 18:43:27

标签: c# forms asp.net-mvc-2

我正在尝试使用MVC2和C#在ASP中创建一个非常简单的表单。我有两个元素和一个提交按钮,我使用VS2010中的设计器制作了表单。

查看:

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<dynamic>" %>

<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
Create
</asp:Content>

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">

<form id="create_event" runat="server">
<h2>Create</h2>
<p>Event ID:
    <asp:TextBox ID="txtEventID" runat="server"></asp:TextBox>
</p>
<p>Event Description:
    <asp:TextBox ID="txtEventDescription" runat="server"></asp:TextBox>
</p>
<p>
    <asp:Button ID="submit" runat="server" Text="Add Event" />
</p>

</form>

</asp:Content>

我现在遇到的问题是当我尝试访问控制器中的表单元素时,我使用FormCollection对象获得了奇怪的键名。

控制器:

public ActionResult Create(FormCollection collection)
    {
        try
        {
            // TODO: Add insert logic here
            foreach (var key in collection)
            {
                var ks = key.ToString();
                var value = collection[key.ToString()];
            }

            return RedirectToAction("Index");
        }
        catch
        {
            return View();
        }
    }

两个控件的name属性用于键,它在运行时设置为ctl00 $ MainContent $ txtEventDescription和ctl00 $ MainContent $ txtEventID。有什么方法可以通过我在设计时设置的ID来引用这些项目吗?我尝试使用与id相同的值添加name属性,但这不起作用。

谢谢!

3 个答案:

答案 0 :(得分:1)

从表单中删除runat="server",这在MVC中是完全不需要的。您也不应该使用表单集合,而应该使用模型绑定。并且摆脱<asp:*>控件,它们在MVC中无用。

相反,请使用Html助手<%: Html.TextBoxFor(m => model.property) %>

使用提供的Html.BeginForm()助手更加容易:

<%: using (Html.BeginForm()) { %>
     .... your stuff
<%: } %>

重新阅读后,我发现您的问题是您使用的是表单设计器,而不是MVC页面。

答案 1 :(得分:1)

试试这个:

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<YourNamespace.YourModel>" %>

<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
    Create
</asp:Content>

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">

<% using (Html.BeginForm("AddEvent", "YourControllerName", FormMethod.Post, new { id = "create_event" }))
     { %>
    <h2>Create</h2>
    <p>Event ID: <%= Html.TextBox("txtEventID", Model.txtEventID)%> </p>
    <p>Event Description: <%= Html.TextBox("txtEventDescription", Model.txtEventDescription)%> </p>
    <button id="submit">Add Event</button>
  <% } %>
</asp:Content>

您需要使用属性“txtEventID”和“txtEventDescription”创建一个模型...这是您将在第一行(在尖括号之间)添加到Inherits属性的名称空间的模型。 / p>

您犯的错误是使用经典的ASP控件。 MVC处理纯HTML,并使用HTML帮助程序来帮助生成它。 HTML.Textbook()是这样的帮手。

......事实上,没有必要使用帮助器和模型......你可以像这样使用直接的HTML:

<p>Event ID: <input type="text" id="txtEventID" name="txtEventID" /> </p>
<p>Event Description: <input type="text" id="txtEventDescription" name="txtEventDescription" /> </p>

我的建议:在这里运行教程:http://www.asp.net/mvc/tutorials

最后,如果您正在使用Model方法,则可以重写Controller操作:

public ActionResult Create(YourModel Model)
    {
        Model.txtEventID ...
    }

ASP.NET MVC使用“模型绑定”将表单的值绑定到模型,这样您就不需要访问FormCollection。

很多可以在这里吸收,但我的建议是再次通过教程来掌握基础知识。你不会后悔的。

答案 2 :(得分:0)

您的设计师所做的是创建html标记,就像在Web表单中使用而不是在mvc中一样。 你需要的是“cryotello”写的

你需要创建一个实体表示。

您可能感兴趣的是以下项目有很好的解释 http://nerddinner.codeplex.com/

同样好的投资将是Steven Sanderson的ASP.NET MVC 2书

它涵盖了加载基本内容

祝你好运