認めざるを得ないのは、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();
}
}