我不得不承认,从 Web 表单到 MVC 的转变确实让我大吃一惊。与 Web 窗体相比,我似乎无法完全理解 MVC 的功能,并且在尝试执行看似简单的任务时,我继续遇到一个又一个的障碍。再加上 javascript/jquery 的基本知识,我大部分时间都在摸不着头脑。
我一直在努力将我公司构建的自定义 CMS 从 Web 表单转换为 MVC。此 CMS 允许创建页面和操作站点导航,从而创建页面模型以及相关视图和控制器。
虽然客户可以编辑 99% 的网站,但有些元素是静态的,并且在特定页面上按需加载。例如,联系页面存在于 CMS 中,但站点会根据需要注入实际的联系表单。
在 Web 表单中构建时,此联系表单只是一个用户控件,具有处理回发的自己的逻辑。我认为这里的逻辑转换是创建局部视图,但我在完成这项任务时遇到了可笑的困难。虽然我已经能够为这个联系表单创建模型、视图和控制器,但我似乎无法让它正常工作。
经过 3 天的时间在 Stack Overflow 上寻求建议后,我完成了几乎所有工作来完成这项工作。但是,我不知道如何从局部视图执行看似简单的重定向来挽救我的生命。我尝试了许多方法,包括在Doug.Instance中描述的一种,但没有任何运气。发布后,即使控制器使用“return PartialView”,部分视图也会作为整个视图返回。如果我再次发布它,它会返回原来显示的部分视图。此外,我的Redirect
变量在成功后没有更新,并且OnSuccess
javascript 没有触发。
下面是我的代码。请帮帮我,因为我的头发快用完了...
页面视图(为了简洁而缩短)
...
@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();
}
}