0

テスト「mvc1application」で、ローカルでうまく機能する簡単な連絡先フォームを作成しました。このフォームがあるサイトの 1 つに正確なコードを転送すると、問題が発生し、本当に困惑します。

シナリオは、ユーザーが (SSO システムを通じて) 既に認証されているかどうかを確認するサイトにアクセスしたときです。その場合、Cookie が設定され、ログインされます。ログインせずにサイトにアクセスしようとすると、現在、'AccessDenied.cshtml' ビューにリダイレクトされます。それはまったく問題ありません。

それ以来、そのビューを、ユーザーが Web マスターに電子メールで送信するために記入できるフォーム (単純な連絡フォーム) に置き換えました。フォームが正しく表示されるようになり、POST で 200 が返され、Chrome 開発ツールを介してフォームのコンテンツが POSTED であることがわかります。起こっていないのは、私の EmailViewModel.cs が呼び出されてフォームデータを処理しているとは思わないということです。したがって、メールは送信されません。

私は本当に困惑しています。サンプルコードの一部を次に示します。

(いくつかの部分が切り取られた私のAccountController...)

[AllowAnonymous]
public ActionResult LogOn(string strEmail, string token)
{
    DepartmentUser departmentuser = db.DepartmentUsers.SingleOrDefault(r => r.UserEmail == strEmail && r.Token == token);
    if (departmentuser != null)
    {
        //verify that the token date  + 1 day >= current datetime
        if (departmentuser.TokenDate.Value.AddDays(1) >= DateTime.Now)
        {
            //if yes, then update to set token = null and datetime = null
            departmentuser.Token = null;
            departmentuser.TokenDate = null;
            db.SaveChanges();

            string userData = departmentuser.DepartmentUserID.ToString() + ":" + departmentuser.DepartmentID.ToString() + ":" + departmentuser.UserName;

            FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(1, departmentuser.UserEmail,
                DateTime.Now, DateTime.Now.AddMinutes(FormsAuthentication.Timeout.TotalMinutes),
                false, userData);
            string hashedTicket = FormsAuthentication.Encrypt(ticket);

            HttpCookie cookie = new HttpCookie(FormsAuthentication.FormsCookieName, hashedTicket);
            Response.AppendCookie(cookie);
            return Redirect("~/Home");
        }
        else
        {
            return View("RequestForm");

        }
    }
    else
    {
        return View("RequestForm");
    }
}

public ActionResult RequestForm(EmailViewModel emailVM)
{
    if (!ModelState.IsValid)
    {
        return View(emailVM);
    }

    var email = new EmailViewModel
    {

        Name = emailVM.Name,
        EmailAddress = emailVM.EmailAddress,
        InternalTeamName = emailVM.InternalTeamName,
        InternalTeamLeadName = emailVM.InternalTeamLeadName,
        InternalDistEmail = emailVM.InternalDistEmail,
        AverageNumCommsWeekly = emailVM.AverageNumCommsWeekly,
        AverageNumPeopleSentWeekly = emailVM.AverageNumPeopleSentWeekly
    };

    string body = "Name: " + email.Name + "\n"
                + "Email: " + email.EmailAddress + "\n"
                + "Internal Team: " + email.InternalTeamName + "\n"
                + "Internal Team Lead: " + email.InternalTeamLeadName + "\n"
                + "Internal Team Lead Email: " + email.InternalTeamLeadEmail + "\n"
                + "Internal Distribution Email: " + email.InternalDistEmail + "\n"
                + "Average # of Communications Per Week: " + email.AverageNumCommsWeekly + "\n"
                + "Average # of People Emailed Per Week: " + email.AverageNumPeopleSentWeekly;

    MailMessage mail = new MailMessage();

    mail.From = new MailAddress(email.EmailAddress);
    // for production put email in web.config for easy change
    mail.To.Add("user@email.me");
    mail.Subject = "Access Request";
    mail.Body = body;
    mail.IsBodyHtml = true;

    // smtp is local directory in web.config for testing ATM...
    SmtpClient smtp = new SmtpClient();

    smtp.Send(mail);

    mail.Dispose();
    return View("RequestForm");

}

そして私の EmailViewModel.cs...

namespace MVC.Models
{
    public class EmailViewModel
    {
        [Required]
        public string Name { get; set; }

        [Required]
        [DataType(DataType.EmailAddress)]
        public string EmailAddress { get; set; }

        [Required]
        public string InternalTeamName { get; set; }

        [Required]
        public string InternalTeamLeadName { get; set; }

        [Required]
        public string InternalTeamLeadEmail { get; set; }

        [Required]
        public string InternalDistEmail { get; set; }

        [Required]
        public string AverageNumCommsWeekly { get; set; }

        [Required]
        public string AverageNumPeopleSentWeekly { get; set; }


    }
}

そして最後に私の Requestform.cshtml ビュー...

@model CorpNewsMgr.Models.EmailViewModel
@{
    ViewBag.Title = "Request Access";
    Layout = "~/Views/Shared/_WideLayoutDenied.cshtml";
}
<p>
    Currently you do not have the required credentials to access the site.
    <br />
    To request more information, or to request permission to access this system, please
    contact:
</p>
<br />
<br />
<div>
    <h3>
        Please fill this form out to request access to the tool.</h3>
    @using (Html.BeginForm())
    {
        @Html.ValidationSummary(true)
        <fieldset>
            <legend>Request Access</legend>
            <div class="editor-label">
                @Html.LabelFor(Model => Model.Name)
            </div>
            <div class="editor-field">
                @Html.TextBoxFor(Model => Model.Name)
                @Html.ValidationMessageFor(Model => Model.Name)
            </div>
            <div class="editor-label">
                @Html.LabelFor(Model => Model.EmailAddress)
            </div>
            <div class="editor-field">
                @Html.TextBoxFor(Model => Model.EmailAddress)
                @Html.ValidationMessageFor(Model => Model.EmailAddress)
            </div>
            <div class="editor-label">
                @Html.LabelFor(Model => Model.InternalTeamName)
            </div>
            <div class="editor-field">
                @Html.TextBoxFor(Model => Model.InternalTeamName)
                @Html.ValidationMessageFor(Model => Model.InternalTeamName)
            </div>
            <div class="editor-label">
                @Html.LabelFor(Model => Model.InternalTeamLeadName)
            </div>
            <div class="editor-field">
                @Html.TextBoxFor(Model => Model.InternalTeamLeadName)
                @Html.ValidationMessageFor(Model => Model.InternalTeamLeadName)
            </div>
            <div class="editor-label">
                @Html.LabelFor(Model => Model.InternalTeamLeadEmail)
            </div>
            <div class="editor-field">
                @Html.TextBoxFor(Model => Model.InternalTeamLeadEmail)
                @Html.ValidationMessageFor(Model => Model.InternalTeamLeadEmail)
            </div>
            <div class="editor-label">
                @Html.LabelFor(Model => Model.InternalDistEmail)
            </div>
            <div class="editor-field">
                @Html.TextBoxFor(Model => Model.InternalDistEmail)
                @Html.ValidationMessageFor(Model => Model.InternalDistEmail)
            </div>
            <div class="editor-label">
                @Html.LabelFor(Model => Model.AverageNumCommsWeekly)
            </div>
            <div class="editor-field">
                @Html.TextBoxFor(Model => Model.AverageNumCommsWeekly)
                @Html.ValidationMessageFor(Model => Model.AverageNumCommsWeekly)
            </div>
            <div class="editor-label">
                @Html.LabelFor(Model => Model.AverageNumPeopleSentWeekly)
            </div>
            <div class="editor-field">
                @Html.TextBoxFor(Model => Model.AverageNumPeopleSentWeekly)
                @Html.ValidationMessageFor(Model => Model.AverageNumPeopleSentWeekly)
            </div>
            <p>
                <input type="submit" value="Send" />
            </p>
        </fieldset>

    }
</div>
<br />
<p>
    Thank you,<br />

</p>

SOページが読み込まれると、フォームが正常に読み込まれます(yay)。私はそれを記入し、それをうまく検証することができます(イェーイ)。送信時に 200 が返され、POST は問題ないように見えます (POST のフィールドを確認できます) が、何も起こりません。ページが空のフォームとして再読み込みされ、ピックアップ フォルダーなどにメールが表示されません。

繰り返しますが、ローカルの開発テスト サイトでは、問題なく動作してルーティングできます。ここではできません。問題は AccountController の上部とそれがどのようにビューを引っ張っているのかにあると思いますが、これを理解しようとして困惑しています (そして疲れています)。

ああ、それは標準の WebForms からの MVC フォーム構築への私の最初の大規模な進出です...

何かご意見は?

ありがとう!

4

1 に答える 1

1

コメントするつもりでしたが、長すぎました。

投稿先のアクションをRequestform.cshtml投稿する必要があります。また、アカウントコントローラーコードはここでは実際には必要ありません。私の推測では、あなたのホスティング環境は共有ホスティングであり、あなたの電子メールコードが機能するのを妨げる何かがあります。

あなたが最初にしたいかもしれないことはあなたの電子メールコードがの中にあるならば、それが投げてエラーになるようにtry catch一時的に私たちにコメントすることです。try catchこれは、少なくとも何が起こっているのかを知るのに役立つはずです。

次に行うことはElmah、mvc3に追加してみることです。これは、VisualStudioのNugetを介して追加できます。Elmah for MVC3は、ほとんどすべてがセットアップされているので、必ず使用してください。これにより、エラーがスローされていることを確認できます。

そうでなければ、あなたの実際の電子メールコードを見ずに私はこれ以上の助けになることはできません。

于 2012-09-08T13:06:06.957 に答える