第二个MVC表单没有发布

时间:2014-09-02 16:30:42

标签: asp.net-mvc-4

我的项目有两个模型,我在第一页显示第一个模型。后期处理效果很好,我可以看到所有数据。控制器构建第二个模型并显示第二个页面。这第二页根本不会发布。它根本无法验证所需的字段。我是MVC的新手,所以很可能有一些我很想念的东西。有人能指出我的方向,一些关键的事情要寻找吗?

由于安全性,我无法真正分享大量代码。但基本上,第一种形式只是一个简单的模型,加载了文本框的助手并进行了验证。发布时,调用第二个模型并显示页面。但它根本无法验证或发布。

 [HttpGet]
 public ActionResult TourRequest()
 {
    PointofContactModel model = new PointofContactModel();
    return View(model);
 }
 [HttpPost]
 public ActionaResult TourRequest(PointofContactModel model)
 {
    model.validate(this);
    model.save(this);
    TourModel tourModel = new TourModel();
    return View("TourDetails", tourModel);
 }

基本上就是这样。我用@ Html.BeginForm的东西开始每个表单,一旦渲染它们就会看起来正确 - 查看视图源。

出于某种原因,我无法在任何帖子中添加评论,即使是我自己的评论!我尝试了重定向和为TourModel执行HttpGet所推荐的内容,但该页面仍未验证或发布。我迷路了。

第一页:

 @model Requests.Web.Models.PointofContactModel
 @using (Html.BeginForm("TourRequest", "RequestController", FormMethod.Post))
 {
  // fields filled in
 }

第二页,几乎相同,使用不同的模型

 @model Requests.Web>Models.TourModel
 @using (Html.BeginForm("TourDetails", "RequestController", FormMethod.Post))
 {
   //stuff
 }

3 个答案:

答案 0 :(得分:0)

好的,我不能确定你的代码,但试试这个。

在您的HTML中使用以下代码:

@using(Html.BeginForm("TourDetails", "ControllerName", FormMethod.Post, null))
{
    @Html.AntiForgeryToken()
    // You don't necessarily need this, but if you already do then you need to put
    // [ValidateAntiForgeryToken] on the top of your action
{

你的控制器的结构是合理的,我认为这个问题是因为你有@Html.AntiForgeryToken()但是你没有选择通过控制器验证它,这反过来可能导致未经处理的例外。

或者,如果所有其他方法都失败,您可以执行以下操作(如果您在视图中使用了反伪造验证,请执行以下操作):

public ActionResult TourRequest()
{
     //Do the HTTPGET stuff here
}

[HttpPost, ActionName("TourRequest")]
public ActionResult TourRequestPostRequest()
{
     // Do the post method stuff here
}

请记住,这只是猜测,因为我在视图中看不到您的代码。

答案 1 :(得分:0)

有时最简单的事情就在你面前而你却错过了。我在@ HTML.BEGINFORM括号的第二个表格OUTSIDE上有提交按钮。笨

答案 2 :(得分:-1)

在你的帖子控制器中纠正这个:

只需删除这些行

即可
 TourModel tourModel = new TourModel();
 return View("TourDetails", tourModel);

并写下这个

return RedirectToAction("TourDetails");

您的TourDetails操作将如下所示:

[HttpGet]
Public ActionResult TourDetails
{
   TourModel tourModel = new TourModel();
   //bind model here if required
   retrun View(tourModel);
}

请记住,这只是猜测,因为您没有在视图中发布代码。

在您的编辑中将RequestController更改为仅在BeginForm()中的Request。