簡體   English   中英

如何顯示具有多種形式的視圖的視圖模型驗證?

[英]How to display view model validation for a view that has multiple forms on it?

我試圖更好地了解如何正確構造我的ASP.NET MVC代碼,以處理單個視圖包含多種形式的情況。 我認為將表單提交給自己的操作方法是有意義的,這樣每個表單都可以受益於其自己的視圖模型參數綁定和驗證,並避免將所有表單參數放入一個更大的整體視圖模型中。

我正在嘗試編碼這種模式,但似乎無法將松散的一端綁在一起。

我在下面編寫了一些示例操作方法以及示例視圖模型類,以證明自己在嘗試實現什么。 可以說我有一個Item Detail操作方法和視圖。 在這個Detail視圖上,我有兩種形式-一種創建新的Comment ,另一種創建新的Note CommentNote POST到其自己的操作方法DetailNewCommentDetailNewNote

成功完成后,這些POST處理程序操作方法就可以正常工作。 但是,在無效的模型狀態下,我返回View(model)以便可以在原始的Detail視圖上顯示問題。 這將嘗試渲染一個名為Brief的視圖,而不是Detail 如果我使用重載的View調用,該調用允許我指定要渲染的視圖,那么現在我所使用的不同視圖模型類存在問題。 現在,特定的視圖模型類不再適用於原始的DetailViewModel

我覺得自己做錯了。 我應該如何處理多種形式的這種情況? 謝謝!

public ActionResult Detail(int id)
{
  var model = new ItemDetailViewModel
  {
    Item = ItemRepository.Get(id)
  };

  return View(model);
}

[HttpPost]
public ActionResult DetailNewComment(int id, ItemDetailNewCommentViewModel model)
{
  if (!ModelState.IsValid)
  {
    return View(model);
  }

  var comment = CommentRepository.Insert(new Comment
  {
    Text = model.Text
  });

  return RedirecToAction("Detail", new { id = id; });
}

[HttpPost]
public ActionResult DetailNewNote(int id, ItemDetailNewNoteViewModel model)
{
  if (!ModelState.IsValid)
  {
    return View(model);
  }

  var note = NoteRepository.Insert(new Note
  {
    Text = model.Text
  });

  return RedirectToAction("Detail", new { id = id; });
}

...具有類似...的視圖模型

public class ItemDetailViewModel
{
  public Item Item { get; set; }
}

public class ItemDetailNewCommentViewModel
{
  public string Text { get; set; }
}

public class ItemDetailNewNoteViewModel
{
  public string Text { get; set; }
}

對於您的情況,我建議您有一個主模型,例如ItemDetailViewModel類,您將為每個子模型添加一個屬性。

public class ItemDetailViewModel
{
  public Item Item { get; set; }
  public ItemDetailNewCommentViewModel NewCommentModel {get;set;}
  public ItemDetailNewNoteViewModel NoteModel {get;set;}
}

您的“詳細信息”視圖將為主視圖,另外兩個將為局部視圖。 主視圖將接收ItemDetailViewModel的一個實例作為模型,而在內部視圖中,您將通過傳遞Model.NewCommentModel和Model.NoteModel作為它們的相應模型來渲染部分。 為了能夠為每個表單使用單獨的動作,而不是常規表單,可以使用ajax表單,因此您將僅向服務器發送相關信息,而不會更改主視圖的其余部分。

這里的主要問題是,當用戶混亂並且他們的帖子未通過服務器端驗證時會發生什么。 如果選擇將它們帶到只顯示一個表單的頁面,則可以發布到其他操作,但是如果要重新顯示兩個表單,則它們都應指向同一操作。

真的,您只需要做出選擇。 我見過網站同時處理這兩種情況。 就我個人而言,我更喜歡重新顯示原始表單,這意味着可以在同一操作中處理兩種表單。 可能會導致膨脹,但是您可以從操作中排除很多邏輯,從而最終只能根據提交的表單而只得到一個分支。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM