Asp.net mvc 2 将参数从视图中的文本框传递到ASP.Net MVC2中的控制器

Asp.net mvc 2 将参数从视图中的文本框传递到ASP.Net MVC2中的控制器,asp.net-mvc-2,parameter-passing,actionlink,Asp.net Mvc 2,Parameter Passing,Actionlink,我正在尝试ASP.NETMVC2,通过构建一个小样本网站,该网站除其他功能外,还为用户提供“联系我们”页面。这个想法是允许用户输入他们的姓名、电子邮件地址、消息主题和消息。要发送消息,用户单击ActionLink。这是一种观点: <% Html.BeginForm(); %> <div> <%: Html.Label("Name")%> <br /> <%: Html.TextBox("txtName", ""

我正在尝试ASP.NETMVC2,通过构建一个小样本网站,该网站除其他功能外,还为用户提供“联系我们”页面。这个想法是允许用户输入他们的姓名、电子邮件地址、消息主题和消息。要发送消息,用户单击ActionLink。这是一种观点:

    <% Html.BeginForm(); %>
<div>
    <%: Html.Label("Name")%>
    <br />
    <%: Html.TextBox("txtName", "",new { style = "width:100%" })%>
    <br />
    <%: Html.Label("Email address")%>
    <br />
    <%: Html.TextBox("txtEmail", "", new { style = "width:100%" })%>
    <br />
    <%: Html.Label("Subject")%>
    <br />
    <%: Html.TextBox("txtSubject", "", new { style = "width:100%" })%>
    <br />
    <%: Html.Label("Message")%>
    <br />
    <%: Html.TextBox("txtMessage", "", new { style = "width:100%" })%>
</div>
<div style='text-align: right;'>
    <%: 
        Html.ActionLink("Send", "SentEmail", new { name = Html.g, sender = "txtEmail", subject = "txtSubject", message="txtMessage" })
    %>      
</div>
<% Html.EndForm(); %>
然而。。。当我单击链接时,传递到方法中的值为null。我尝试过创建一条路线来实现这一点,但它也不起作用。我应该用另一种方法吗

谢谢,


Morris

操作链接不会触发http post,也不会传递表单字段的值,只是一个http get,不会传递任何表单数据-理想情况下,您可以使用输入提交按钮发布数据。可以肯定的是,任何导致创建/更新数据的请求都应该通过http post完成,这是一种很好的做法

提交按钮就像这样

<input type="submit" value="Send" />
其次,您可以使用方法参数并依赖于模型绑定,但必须确保字段名与参数名匹配,以便

<%: Html.TextBox("txtEmail", "", new { style = "width:100%" })%>
如果此表单未发布到返回视图的同一操作,则您还需要更改begin表单标记,理想情况下您也应该使用“using”。所以你会得到:

<% using (Html.BeginForm("SendEmail", "<controller-name>"))
   { %>
.... form fields in here ...
<input type="submit" value="Send" />
<% } %>

.... 在这里形成字段。。。
如果该按钮不适合您的设计,您可以使用以下按钮:

<input type="image" src="<%: Url.Content("~/Content/images/myimage.gif") %>" value="Send" />

这也会产生同样的效果。要从一个标记触发一篇文章,尽管您需要看看如何使用javascript,但我记不清确切的语法,但我认为如果您使用jquery,您会看到如下内容:(仅形成一个表单页面)



但是,您创建了一个对javascript的依赖,实际上您应该尝试让您的站点优雅地降级,以便禁用javascript的访问者可以使用它。在满足设计要求的同时,可能还有更高级的方法来实现这一点,但这可能会严重影响客户端代码,这可能超出您对示例的要求。

操作链接不会触发http post,也不会传递到表单字段的值中,只需一个http get,不传递任何表单数据——理想情况下,您应该使用输入提交按钮发布数据。可以肯定的是,任何导致创建/更新数据的请求都应该通过http post完成,这是一种很好的做法

提交按钮就像这样

<input type="submit" value="Send" />
其次,您可以使用方法参数并依赖于模型绑定,但必须确保字段名与参数名匹配,以便

<%: Html.TextBox("txtEmail", "", new { style = "width:100%" })%>
如果此表单未发布到返回视图的同一操作,则您还需要更改begin表单标记,理想情况下您也应该使用“using”。所以你会得到:

<% using (Html.BeginForm("SendEmail", "<controller-name>"))
   { %>
.... form fields in here ...
<input type="submit" value="Send" />
<% } %>

.... 在这里形成字段。。。
如果该按钮不适合您的设计,您可以使用以下按钮:

<input type="image" src="<%: Url.Content("~/Content/images/myimage.gif") %>" value="Send" />

这也会产生同样的效果。要从一个标记触发一篇文章,尽管您需要看看如何使用javascript,但我记不清确切的语法,但我认为如果您使用jquery,您会看到如下内容:(仅形成一个表单页面)



但是,您创建了一个对javascript的依赖,实际上您应该尝试让您的站点优雅地降级,以便禁用javascript的访问者可以使用它。在满足设计要求的同时,可能还有更先进的方法来实现这一点,但这可能会严重影响客户端代码,而客户端代码可能超出了您对示例的要求。

实际上,实现您想要的比在示例中更容易。从未听说过模型类、模型绑定器和强类型视图?给你

模范班

public class ContactUsModel
{
    public string Name { get; set; }
    public string Email { get; set; }
    public string Subject { get; set; }
    public string Message { get; set; }
}
然后在控制器中应该有两个操作:第一个操作用默认值显示表单,第二个操作用用户放置的数据接收表单。这两个动作精确地映射到HttpGet和HttPost谓词

[HttpGet]
public virtual ActionResult ContactUs() {
    ContactUsModel model = new ContactUsModel();
    return View(model);
}


[HttpPost]
public virtual ActionResult ContactUs( ContactUsModel model ) {
    //e.g. Save the contact request to database
}
要使用此选项,您的视图必须强类型化为
ContactUsModel

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<ContactUsModel>" %>

<% using (Html.BeginForm()) { %>
    <div>
        <%: Html.LabelFor(model => model.Name) %><br />
        <%: Html.TextBoxFor(model => model.Name, new { style = "width:100%" })%>
    </div>
    <div>
        <%: Html.LabelFor(model => model.Email) %><br />
        <%: Html.TextBoxFor(model => model.EMail, new { style = "width:100%" })%>
    </div>
    <div>
        <%: Html.LabelFor(model => model.Subject) %><br />
        <%: Html.TextBoxFor(model => model.Subject, new { style = "width:100%" })%>
    </div>
    <div>
        <%: Html.LabelFor(model => model.Message) %><br />
        <%: Html.TextAreaFor(model => model.Message, new { style = "width:100%" })%>
    </div>
    <div>
        <input type="submit" value="Save" />
    </div>
<% } %>

型号.名称)%>
model.Name,新的{style=“width:100%”)%> model.Email)%>
model.EMail,新的{style=“width:100%”)%> model.Subject)%>
model.Subject,新的{style=“width:100%”)%> model.Message)%>
model.Message,新的{style=“width:100%”)%>

这一切的魔力被称为ModelBinder。请阅读有关MVC的更多信息。

实际上,实现您想要的比您的示例中更容易。从未听说过模型类、模型绑定器和强类型视图?给你

模范班

public class ContactUsModel
{
    public string Name { get; set; }
    public string Email { get; set; }
    public string Subject { get; set; }
    public string Message { get; set; }
}
然后在控制器中应该有两个操作:第一个操作用默认值显示表单,第二个操作用用户放置的数据接收表单。这两个动作精确地映射到HttpGet和HttPost谓词

[HttpGet]
public virtual ActionResult ContactUs() {
    ContactUsModel model = new ContactUsModel();
    return View(model);
}


[HttpPost]
public virtual ActionResult ContactUs( ContactUsModel model ) {
    //e.g. Save the contact request to database
}
要使用此选项,您的视图必须强类型化为
ContactUsModel

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<ContactUsModel>" %>

<% using (Html.BeginForm()) { %>
    <div>
        <%: Html.LabelFor(model => model.Name) %><br />
        <%: Html.TextBoxFor(model => model.Name, new { style = "width:100%" })%>
    </div>
    <div>
        <%: Html.LabelFor(model => model.Email) %><br />
        <%: Html.TextBoxFor(model => model.EMail, new { style = "width:100%" })%>
    </div>
    <div>
        <%: Html.LabelFor(model => model.Subject) %><br />
        <%: Html.TextBoxFor(model => model.Subject, new { style = "width:100%" })%>
    </div>
    <div>
        <%: Html.LabelFor(model => model.Message) %><br />
        <%: Html.TextAreaFor(model => model.Message, new { style = "width:100%" })%>
    </div>
    <div>
        <input type="submit" value="Save" />
    </div>
<% } %>

型号.名称)%>
model.Name,新的{style=“width:100%”)%> model.Email)%>
model.EMail,新的{style=“width:100%”)%> model.Subject)%>
model.Subject,新的{style=“width:100%”)%> model.Message)%>
model.Message,新的{style=“width:100%”)%>

这一切的魔力被称为ModelBinder。请阅读有关MVC的更多信息。

我应该提到,在访问表单数据的方法中,您可以创建一个类作为表单数据的强类型容器—从长远来看,这样的视图模型是最好的方法。mvc中的模型绑定功能非常强大。感谢您的帮助,非常感谢。你的