C# 使控制器在以下情况下将部件动态返回到包含该小部件的任何页面!ModelState.IsValid

C# 使控制器在以下情况下将部件动态返回到包含该小部件的任何页面!ModelState.IsValid,c#,model-view-controller,orchardcms,C#,Model View Controller,Orchardcms,所以我制作了一个orchard模块,它基本上是一个作为小部件的联系人表单。此小部件可以作为一个部件(或小部件)放置在任何页面上,并将其数据发布到处理post数据的控制器,一旦发送电子邮件,它将返回一个“已发送”视图,其中总结了它们的输入。我遇到的问题是处理一个无效的模型。当我调试代码时,它很好地进入了验证过程 if (!ModelState.IsValid) { //Gets here no problem } 但问题是,由于我的小部件基本上可以位于任何页面(主页、单独页面、全局区域,因

所以我制作了一个orchard模块,它基本上是一个作为小部件的联系人表单。此小部件可以作为一个部件(或小部件)放置在任何页面上,并将其数据发布到处理post数据的控制器,一旦发送电子邮件,它将返回一个“已发送”视图,其中总结了它们的输入。我遇到的问题是处理一个无效的模型。当我调试代码时,它很好地进入了验证过程

if (!ModelState.IsValid)
{
   //Gets here no problem
}
但问题是,由于我的小部件基本上可以位于任何页面(主页、单独页面、全局区域,因此它位于每个页面),它可以是小部件或类型的一部分。我不知道如何将模型发送回发件人页面。我想我有几个选择

另一个有趣的注意事项是,如果我将表单放在网站的“全局”区域(如每个页面上的侧栏,更重要的是我的“已发送”页面),那么该页面上的表单实际上会在表单上呈现“验证”错误。因此,尽管我没有显式返回视图模型,但它仍在将视图模型传递给页面

a) 以某种方式将发送者url映射到控制器操作,例如,如果url没有子域,则我们将其路由到主页控制器或其他任何位置(不确定orchard如何处理它)

b) 不知何故,在处理程序/驱动程序区域执行此操作,也不确定我将如何执行此操作


c) 与其这样做,不如让我的控制器返回json数据,并通过jquery将表单发布到控制器异步。

如果您没有硬性要求系统必须在未启用Javascript时工作,我个人会选择json/Ajax方式(或者当你可以接受当Javascript被禁用时你的系统被禁用了)。另外,它给了你方一个很好的行为……就像AJAX对任何站点所做的一样;)

将联系人小部件呈现为PartialView或PartialAction(两者都可以工作,您可能已经运行了它)

@* This is, of course, oversimplified for the sake keeping the post short. 
   I'd be happy to provide more details if you need'em *@
<form id="contact" action="@Url.Action("ContactWidget", "Send")" method="post">
{
    @Html.Textbox("name");
    @Html.TextArea("message");
    <input type="submit" value="Send" />
}
这将用您从POST调用中得到的响应替换表单容器的内容。因此,此时,您可以随意实现控制器的发送操作,并让它使用部分视图内容进行响应。无论返回的HTML是带有验证错误的同一表单,还是“谢谢”信息,由你决定。 它可能是像

public ActionResult Send(SendViewModel model)
{
    if (!ModelState.IsValid)
        return View("Widget", model); // where "Widget" is the .cshtml with the form

    // do the actual message sending...

    // return a thank you note
    return View("ThankYou"); // where "ThankYou" is the .cshtml with the Thank You message
}
请注意,即使未启用Javascript,您的小部件也会向您的小部件发送一个完整的浏览器帖子,但结果只会是联系人表单的输出。除非您需要,否则我不会深入讨论这个问题,但您可以使用Request.IsAjaxRequest()扩展名和HttpReferrer在处理帖子后将用户重定向到原始页面

public ActionResult Send(SendViewModel model)
{
    if (!ModelState.IsValid)
        return View("Widget", model); // where "Widget" is the .cshtml with the form

    // do the actual message sending...

    // return a thank you note
    return View("ThankYou"); // where "ThankYou" is the .cshtml with the Thank You message
}