1

我不得不承认,从 Web 表单到 MVC 的转变确实让我大吃一惊。与 Web 窗体相比,我似乎无法完全理解 MVC 的功能,并且在尝试执行看似简单的任务时,我继续遇到一个又一个的障碍。再加上 javascript/jquery 的基本知识,我大部分时间都在摸不着头脑。

我一直在努力将我公司构建的自定义 CMS 从 Web 表单转换为 MVC。此 CMS 允许创建页面和操作站点导航,从而创建页面模型以及相关视图和控制器。

虽然客户可以编辑 99% 的网站,但有些元素是静态的,并且在特定页面上按需加载。例如,联系页面存在于 CMS 中,但站点会根据需要注入实际的联系表单。

在 Web 表单中构建时,此联系表单只是一个用户控件,具有处理回发的自己的逻辑。我认为这里的逻辑转换是创建局部视图,但我在完成这项任务时遇到了可笑的困难。虽然我已经能够为这个联系表单创建模型、视图和控制器,但我似乎无法让它正常工作。

经过 3 天的时间在 Stack Overflow 上寻求建议后,我完成了几乎所有工作来完成这项工作。但是,我不知道如何从局部视图执行看似简单的重定向来挽救我的生命。我尝试了许多方法,包括在Doug.Instance中描述的一种,但没有任何运气。发布后,即使控制器使用“return PartialView”,部分视图也会作为整个视图返回。如果我再次发布它,它会返回原来显示的部分视图。此外,我的Redirect变量在成功后没有更新,并且OnSuccessjavascript 没有触发。

下面是我的代码。请帮帮我,因为我的头发快用完了...

页面视图(为了简洁而缩短)

...
@if (Model.ID == 8)
{
  //LOAD CONTACT FORM
  @Html.Action("Contact","ContactForm")
}...

联系表局部视图(为简洁起见)

@model NCOWW.Models.ContactForm

<script src="@Url.Content("~/Scripts/jquery-1.5.1.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.unobtrusive-ajax.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>
<script type="text/javascript">
  // Labels over the inputs.
  window.addEvent("load", function () {
    var myForm = document.id('contactForm');
    myForm.getElements('[type=text], textarea').each(function (el) {
      new OverText(el);
    });
  });
  function FormComplete() {
    if ($("#Redirect").val() != '') {
      document.location = $("#Redirect").val();
    } 
  } 
</script>
@using (Ajax.BeginForm(new AjaxOptions { UpdateTargetId = "contactForm", OnSuccess = "FormComplete" }))
{
  @Html.ValidationSummary(true)
  <div id="contactForm">
    @Html.HiddenFor(model => model.Redirect)

    @Html.TextBoxFor(model => model.Name, new { tabindex = 1, @class = "half", Title = @Html.DisplayNameFor(model => model.Name) })
    @Html.ValidationMessageFor(model => model.Name)

       @Html.TextAreaFor(model => model.Comments, new { tabindex = 13, Title =     @Html.DisplayNameFor(model => model.Comments) })
    @Html.ValidationMessageFor(model => model.Comments)

    <br />
    <input type="submit" value="Submit" name="Submit" class="button" />
  </div>
}

联系表格控制器(为简洁起见)

public ActionResult Contact(ContactForm c)
    {
      try
      {
        MailMessage message = new MailMessage();
        message.IsBodyHtml = true;
        message.From = new MailAddress(c.Email);
        message.Body += "<b>Name:</b> " + c.FullName + "<br/><br/>";
        message.Body += "<b>Questions/Comments:</b><br> " + c.Comments;

        SmtpClient client = new SmtpClient();
        client.Send(message);
        c.Redirect = "/formsuccess";

        return PartialView("contactForm", c);
      }
      catch
      {
        return PartialView();
      }
    }
4

3 回答 3

0

您遇到的问题在 ajax 中很常见。您需要注意的是,当 ajax 呈现响应时,它不知道您返回的 javascript。

你需要有某种方式来注册你的javascript才能触发它。

现在该怎么做?我创造了一种对我有用的方法:

在已重新加载的页面上具有 javascript 功能。

function RedirectToLocation(url) {
//your javascript event here
        }

您的 ajax 调用,我有 ajax 操作链接,但开始形式几乎相同

您感兴趣的部分是 AjaxOptions。和事件 OnSuccess。这将在调用成功时触发。

链接示例:

@Ajax.ActionLink("Comments", "AddComment", "Task", new { id = Model.Task.TaskId, TaskStatus = (int)State.Closed }, new AjaxOptions { HttpMethod = "Get", UpdateTargetId = "showResults ", OnSuccess = "RedirectToLocation" } , null)

在这里您可以阅读更多关于 ajax 选项的信息

只需在您的代码示例中为您的操作结果指出问题

try
      {
        MailMessage message = new MailMessage();
        message.IsBodyHtml = true;
        message.From = new MailAddress(c.Email);
        message.Body += "<b>Name:</b> " + c.FullName + "<br/><br/>";
        message.Body += "<b>Questions/Comments:</b><br> " + c.Comments;

        SmtpClient client = new SmtpClient();
        client.Send(message);
        c.Redirect = "/formsuccess";

        return PartialView("contactForm", c);
      }
      catch
      {
        return PartialView();  <-- will render what, better will be if it renderes error mesasge partial view
      }
于 2012-12-14T22:40:59.107 回答
0

通过在部分视图中添加操作名称来尝试

@using (Ajax.BeginForm( "Action Name" ,new AjaxOptions { UpdateTargetId = "contactForm", OnSuccess = "FormComplete" })) {

于 2012-12-15T10:32:27.227 回答
0

一旦我开始重新思考我真正想要实现的目标,我就能让它发挥作用。PartialView("contactForm", c);我最终没有返回,而是返回了Json(c);。然后我解析了返回的 Json 并从那里重定向。最终的工作代码如下。

页面视图(为了简洁而缩短)

...
@if (Model.ID == 8)
{
  //LOAD CONTACT FORM
  @Html.Action("Contact","ContactForm")
}...

联系表局部视图(为简洁起见)

@model NCOWW.Models.ContactForm

<script src="@Url.Content("~/Scripts/jquery-1.5.1.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.unobtrusive-ajax.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>
<script type="text/javascript">
  // Labels over the inputs.
  window.addEvent("load", function () {
    var myForm = document.id('contactForm');
    myForm.getElements('[type=text], textarea').each(function (el) {
      new OverText(el);
    });
  });
  function FormComplete(result) {
    if (result.Redirect != null && result.Redirect != '') {
      document.location = result.Redirect;
    }
  }
</script>
@using (Ajax.BeginForm(new AjaxOptions { UpdateTargetId = "contactForm", OnSuccess = "FormComplete" }))
{
  @Html.ValidationSummary(true)
  <div id="contactForm">
    @Html.HiddenFor(model => model.Redirect)

    @Html.TextBoxFor(model => model.Name, new { tabindex = 1, @class = "half", Title = @Html.DisplayNameFor(model => model.Name) })
    @Html.ValidationMessageFor(model => model.Name)

       @Html.TextAreaFor(model => model.Comments, new { tabindex = 13, Title =     @Html.DisplayNameFor(model => model.Comments) })
    @Html.ValidationMessageFor(model => model.Comments)

    <br />
    <input type="submit" value="Submit" name="Submit" class="button" />
  </div>
}

联系表格控制器(为简洁起见)

public ActionResult Contact(ContactForm c)
{
  try
  {
    MailMessage message = new MailMessage();
    message.IsBodyHtml = true;
    message.From = new MailAddress(c.Email);
    message.Body += "<b>Name:</b> " + c.FullName + "<br/><br/>";
    message.Body += "<b>Questions/Comments:</b><br> " + c.Comments;

    SmtpClient client = new SmtpClient();
    client.Send(message);
    c.Redirect = "/formsuccess";

    return Json(c);
  }
  catch
  {
    //ERROR CATCH CODE
  }
}
于 2012-12-18T19:03:10.290 回答