我有一个联系页面,此页面应显示表单或成功消息或失败消息,所以基本上是这样的:
@model MyApp.Models.ContactData
@{
Layout = "~/Views/Shared/_Layout.cshtml";
}
<div>
...Some static content...
If page was opened the first time
-> Render a form here
Else If form was posted and data successfully processed
-> Render a success message here
Else If form was posted but error occurred during processing
-> Render a failure message here
...Some static content...
</div>
我不知道用MVC 3实现这一目标的最佳方法是什么。我是否创建了三个完全独立的视图(这是我想要避免的,因为静态内容对于所有三个视图都是相同的)?或者我可以创建三个局部视图然后基于另一个标志来决定我可以将哪个部分视图渲染到模型类中?或者我可以从控制器动态地将部分视图注入到视图中吗?
到目前为止我的控制器看起来像这样:
public class ContactController : Controller
{
public ActionResult Index()
{
return View();
}
[HttpPost]
public ActionResult Index(ContactData contactData)
{
if (ModelState.IsValid)
{
ContactService service = new ContactService();
bool result = service.Process(contactData);
return ?; // What do I return now? It must somehow depend on result.
}
else
return View(contactData));
}
}
我有一个与ASP.NET WebForms类似的页面和行为,解决方案是将三个可变标记块放入asp:Panel
控件中,然后打开或关闭那些Visible
标志代码隐藏的面板。我想我需要使用ASP.NET MVC的另一种方法来实现相同的目标。
最好的方法是什么?
提前感谢您的建议!
答案 0 :(得分:2)
也许使用ViewBag来帮助实现这一切。当然它是动态的,所以你可以添加&amp;检查你想要/需要/期望的任何道具。
[HttpPost]
public ActionResult Index(ContactData contactData)
{
if (ModelState.IsValid)
{
ContactService service = new ContactService();
bool result = service.Process(contactData);
ViewBag.ContactSuccess = true;
}
else
{
ViewBag.ModelStateErr= "some err";
}
return View(contactData));
}
然后在你的视图中:
if (ViewBag.ContactSuccess !=null && ((bool)ViewBag.ContactSuccess))
{
//thanks for posting!
}
else
{
if (ViewBag.ModelStateErr !=null)
{
//show that we have an err
}
else
{
//we have no err nor a 'true' contact success yet
//write out the form
}
}
答案 1 :(得分:2)
您可以尝试这种方式:
[HttpPost]
public ActionResult Index(Contact contactData)
{
if (ModelState.IsValid)
{
ContactService service = new ContactService();
if (service.Process(contactData))
{
TempData["Success"] = "Your success message.";
return RedirectToAction("Index");
}
else
{
TempData["Error"] = "Your fail message.";
}
}
return View(contact);
}
答案 2 :(得分:1)
看起来您可以在客户端发出ajax调用,并且根据Json结果,您可以从客户端呈现不同的内容。
答案 3 :(得分:1)
我建议编写三个不同的视图
然后在您的Controller中,您将拥有与之前类似的代码
public class ContactController : Controller
{
public ActionResult Index()
{
return View();
}
[HttpPost]
public ActionResult Index(ContactData contactData)
{
if (ModelState.IsValid)
{
ContactService service = new ContactService();
bool result = service.Process(contactData);
return View("contactSuccess.cshtml");
}
else
return View("contactFail.cshtml", contactData);
}
}
这样每个视图都有一个独立的,你的标记中间没有一个大的内联IF块。
或者(我就是这样做的)你可以让index.cshtml包含三个部分......
然后你可以将部分视图加载到索引视图中,甚至可以使用AJAX动态地将它们交换出来。