asp.net-mvc – MVC Razor – 如何向自己提交表单

前端之家收集整理的这篇文章主要介绍了asp.net-mvc – MVC Razor – 如何向自己提交表单前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我第一次使用MVC和Razor,希望这是一个非常简单的问题.我在网站上有两页.第一页(页面A)上有一个非常小的表单,其中包含电子邮件地址的输入.当用户输入他们的电子邮件地址并单击提交时,他们将使用HttpPost发送到页面B,如下所示:
@using (Html.BeginForm("NewsletterSignup","Common",FormMethod.Post))
{
    <p>
        <input type="text" class="text" value="Enter your email address" id="email" name="email" />
        <input type="submit" class="submit" value="Sign Up" />
    </p>
}

页面B上有一个主要表单,允许用户输入他们的姓名和手机号码.主窗体的控制器如下所示:

//newsletter signup page
public ActionResult NewsletterSignup()
{
    var model = new NewsletterSignupModel();

    return View(model);
}

[HttpPost,ActionName("NewsletterSignup")]
public ActionResult NewsletterSignupSend(NewsletterSignupModel model)
{
    if (ModelState.IsValid)
    {
        //register the user here
    }

    return View(model);
}

在主窗体上,我有一个Validationsummary和每个字段的验证.问题是我的控制器声明只能使用HttpPost执行NewsletterSignupSend操作.因为页面A上的表单在用户到达页面B时使用HttpPost,所以验证已经运行 – 即在用户页面b上提交表单之前.

我知道我在这里错过了一个基本的东西 – 有人能引导我朝着正确的方向前进吗?

提前致谢

更新:要解决此问题,我已完成以下操作.

表格A使用以下方式呈现:

@Html.Action("MiniNewsletterSignup")

表格A有一个控制器方法

//mini newsletter view
        public ActionResult MiniNewsletterSignup()
        {
            var model = new MiniNewsletterSignupModel();

            return View(model);
        }

并且视图的内容是:

@model Nop.Web.Models.Common.MiniNewsletterSignupModel
@using (Html.BeginForm("NewsletterSignup","Common"))
{
    <p>
        <input type="text" class="text" value="Enter your email address" id="email" name="email" />
        <input type="submit" class="submit" value="Sign Up" />
    </p>
}

这会将使用HttpPost的表单提交到页面B.

页面B有2种控制器方法

//newsletter signup page
public ActionResult NewsletterSignup()
{
    var model = new NewsletterSignupModel();

    if (Request["email"] != null)
        model.Email = Request["email"];

    return View(model);
}

和:

[HttpPost,**WhenRequestContainsKey("FullName")**]
public ActionResult NewsletterSignup(NewsletterSignupModel model)
{
    if (ModelState.IsValid)
    {
        //process here
    }

    return View(model);
}

你会注意到我添加了我在http://softwaredevelopmentsolutions.blogspot.co.uk/2011/06/aspnet-mvc-3-partial-form-validation-on.html找到的Selector WhenRequestContainsKey.这意味着只有在Request中有一个名为FullName的字段时才会调用代码,该字段在我们的网站上仅存在于页面B上.

这看起来像我想要的那样工作,但我不知道为什么 – 为什么例如这会停止验证发生,直到表格被发回到页面B上 – 方法中没有任何东西调用验证方法???

我实现这个的方式有什么问题吗?

谢谢

解决方法

我认为您错过了一个帖子操作 – 如果您尝试遵循模式GET-POST-Redirect,您应该避免这些问题(即每个帖子都应该重定向到GET操作):
FirstAction()
{
    return View();
}

[HttpPost]
FirstAction()
{
    //Save email address
    return Redirect("NewsletterSignup","Common");
}

你的第一个表格变成:

@using (Html.BeginForm())
{
    <p>
        <input type="text" class="text" value="Enter your email address" id="email" name="email" />
        <input type="submit" class="submit" value="Sign Up" />
    </p>
}
原文链接:https://www.f2er.com/aspnet/245379.html

猜你在找的asp.Net相关文章