0

我这里需要一些信息。我是 MVC 的新手,因此对你们来说,我认为这将是一个容易回答的问题。我有以下结构:

控制器.cs

Public ActionResult PageMain() {
     return View(); // this is the main page I'm working with
}

[ChildActionOnly]
Public PartialViewResult Partial1(string tablename) {
      //Some code to construct datatable according to the url parameter
      return PartialView("Partial1", DataTable);
}

Public ActionResult FormAction(string tablename, FormCollection formvalues) {
      //Here I send the values to the model in which I have a public void
      //that updates the database -> I'm not using Linq at this phase because 
      //both the tables and fields are dynamic
      //I execute the code in a try and catch statement

      try 
      {
          //some code
          Response.Redirect("url to PageMain");
      } 
      catch (Exception ex) {
          ModelState.AddModelError("Error", ex);
          Return View("PageMain", ex); 
          // actually, here I'd like to send the exception error
          // to the partialview which renders the error as its model but 
          // but I don't know how since if I use return PartialView() 
          // then only the partial view will be displayed, not the whole page
      }
}

最后,在 PageMain 视图中,我有:

//Some initial code with the form that posts value to FormAction
@Html.RenderPartial("Partial1") //this is the partial which shows error 
                                //it is only displayed when the form is posted
                                //and there is an error

好的,现在,我的问题是:这样的结构是否有效(这里所说的有效是指结构是否良好或有更好的方法)?以及如何ModelState.AddModelError()在部分视图“Partial1”中的方法中达到异常?

如果您感到困惑,总结一下:

  • 在 PageMain 中,有一个根据 url-parameter 构造的表。实际上,它是在另一个局部视图中构造的,但显示在 PageMain
  • 当我编辑表格时,表单将我重定向到 FormAction,执行代码以编辑数据库
  • 最后,如果有错误,用户仍然在 FormAction 中,但是在这个页面中使用的 View 仍然是 PageMain,我没有为这个页面设置不同的视图,因为它就像两次构建同一个页面一样。我的意思是,只包含一个显示我不想创建另一个视图的错误的局部视图。相反,我试图用一些 if - else 逻辑使部分视图可见,仅在出现一些错误的情况下
4

1 回答 1

1

我会在这里改变一些事情

首先,这里:

Response.Redirect("url 到 PageMain");      

你想改为返回一个

RedirectToAction("PageMain") 

第二 - 使用 HttpGet 属性使 Pagemain 仅对获取请求有效。

[HttpGet]
公共 actionResult PageMain()
{     
   返回视图();
// 这是我正在使用的主页
}

第三 - 制作这个 HttpPost

[HttpPost]
Public ActionResult FormAction(string tablename, FormCollection formvalues)

第四 - 通常你会看到人们拥有相同名称的 GET 方法和 POST 方法,一个标记为 HttpGet 和一个 HttpPost 当然接受不同的参数类型。

第五 - 我会推荐你​​的视图是一个强类型视图,它不是基于 DataTable 而是你自己的类 - 在你的视图顶部说命名为“客户”,当你看到类似的东西时,你知道它是强类型的(对于客户列表)

@model IEnumerable<客户>

当您这样做时,您的 FormAction 方法可以自动获取 Customer 类型的对象 - MVC 中的模型绑定器自动将您的表单值与此对象中的名称匹配并设置属性值。这是 MVC 的一大特色。所以你的方法会变成:

Public ActionResult FormAction(Customer customer) 

现在你有一个客户对象要处理。

于 2011-06-05T04:31:18.647 回答