Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc MVC Razor-如何向自己提交表单_Asp.net Mvc_Asp.net Mvc 3_Razor - Fatal编程技术网

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

Asp.net mvc MVC Razor-如何向自己提交表单,asp.net-mvc,asp.net-mvc-3,razor,Asp.net Mvc,Asp.net Mvc 3,Razor,我第一次使用MVC和Razor,有一个非常简单的问题。我在这个网站上有两个页面。第一页(A页)有一个非常小的表单,上面有一个电子邮件地址的输入。当用户输入他们的电子邮件地址并单击submit时,他们将使用HttpPost发送到B页,如下所示: @using (Html.BeginForm("NewsletterSignup","Common", FormMethod.Post)) { <p> <input type="text" class="text"

我第一次使用MVC和Razor,有一个非常简单的问题。我在这个网站上有两个页面。第一页(A页)有一个非常小的表单,上面有一个电子邮件地址的输入。当用户输入他们的电子邮件地址并单击submit时,他们将使用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>
}
在主窗体上,我有一个Validationsummary和每个字段的validation。问题是,我的控制器声明只能使用HttpPost执行upsend操作。由于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>
}
以及:

您会注意到,我已经添加了选择器WhenRequestContainsKey,这是我在中找到的。这意味着只有当请求中有一个名为FullName的字段时,才会调用此代码,该字段在我们的站点上仅存在于B页上

这似乎是我想要的,但我不知道为什么-例如,为什么这会停止验证,直到表单发布回B页-在方法中没有调用验证方法

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

谢谢
Al

在第一个上放置一个
[HttpGet]

[HttpGet]
public ActionResult NewsletterSignup()
{  
    var model = new NewsletterSignupModel();
    return View(model);
}

我认为您缺少一个post操作-如果您尝试遵循GET post重定向模式,您应该避免这些问题(即每个post都应该重定向到GET操作):

你的第一种形式是:

@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>
}
@使用(Html.BeginForm())
{

}
Hi Paddy-感谢您的回复。您建议的问题是,第一个表单会通过输入到文本字段中的电子邮件地址传递-如果使用重定向,这将丢失。您可以将电子邮件地址弹出到TempData中,并在下一个GET:(搜索TempData)时访问它。嗨,Paddy-我尝试了您的建议。但是,FirstAction现在生成错误消息“不允许子操作执行重定向操作”。我正在使用@Html.Action(“MiniNewslettesSignup”)调用第一个表单。好的,看起来您无法从渲染中重定向:好的,回到我原来的问题。我只希望将一个表单的内容提交给另一个表单,然后在第二个表单中,仅当单击提交按钮时才验证输入-这是我们在经典ASP和.NET中多年来一直在做的事情-当然,这是开发人员一直需要做的事情。有什么想法吗???
[HttpPost, **WhenRequestContainsKey("FullName")**]
public ActionResult NewsletterSignup(NewsletterSignupModel model)
{
    if (ModelState.IsValid)
    {
        //process here
    }

    return View(model);
}
[HttpGet]
public ActionResult NewsletterSignup()
{  
    var model = new NewsletterSignupModel();
    return View(model);
}
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>
}