0

ポストバックでモデル情報を受け取っていないフォームがあります。私はそれがいつ機能するかを見ることができるようにそれを単純にするためにますますコメントアウトしようとしました、そして今のところ私は運がありません。フォームとモデルの複雑な部分のほとんどをコメントアウトしたので、なぜ問題が発生しているのかわかりません。

以下は、フォームを表示して投稿するためのコントローラー機能です。

public ActionResult MassEmail()
    {
        IEmailTemplateRepository templates = new EmailTemplateRepository();
        IEmailFromAddressRepository froms = new EmailFromAddressRepository();
        IEmployeeRepository emps = new EmployeeRepository();
        List<ProductVersion> vers = new List<ProductVersion>();
        MassEmailViewModel vm = new MassEmailViewModel();

        vers = productVersionRepository.All.OrderBy(o => o.Description).ToList();

        foreach (Employee e in emps.Employees.Where(o => o.Department == "Support" || o.Department == "Professional Services").OrderBy(o => o.Name))
        {
            if (e.Email != null && e.Email.Trim() != "")
            {
                vm.BCCAddresses = vm.BCCAddresses + e.Email + ","; 
            }
        }
        if (vm.BCCAddresses != "")
        {
            vm.BCCAddresses = vm.BCCAddresses.Substring(0, vm.BCCAddresses.Length - 1);
        }

        ViewBag.PossibleCustomers = customerRepository.All.OrderBy(o => o.CustomerName);
        ViewBag.PossibleTemplates = templates.All.OrderBy(o => o.Description);
        ViewBag.PossibleFromAddresses = froms.All.OrderBy(o => o.Description);
        ViewBag.PossibleClasses = scheduledClassRepository.All.OrderByDescending(o => o.ClassDate).ThenBy(o => o.ClassTopic.Description);

        vm.CCAddresses = "bclairmont@harrisworld.com";
        //vm.Attachments = "";
        vm.Body = "";
        vm.Subject = "";
        vm.ToAddresses = "";
        vm.EmailFromAddressID = 1;

        return View(vm);
    }

    [HttpPost]
    public ActionResult MassEmail(MassEmailViewModel vm)
    {
        IEmailFromAddressRepository froms = new EmailFromAddressRepository();

        System.Net.Mail.MailMessage message = new System.Net.Mail.MailMessage();

        message.From = new System.Net.Mail.MailAddress(froms.Find(vm.EmailFromAddressID).Email);

        string[] toAddresses = vm.ToAddresses.Split(',');
        for (int i = 0; i < toAddresses.GetUpperBound(0); i++)
        {
            message.To.Add(new System.Net.Mail.MailAddress(toAddresses[i]));
        }

        string[] CCAddresses = vm.CCAddresses.Split(',');
        for (int i = 0; i < CCAddresses.GetUpperBound(0); i++)
        {
            message.To.Add(new System.Net.Mail.MailAddress(CCAddresses[i]));
        }

        string[] BCCAddresses = vm.BCCAddresses.Split(',');
        for (int i = 0; i < BCCAddresses.GetUpperBound(0); i++)
        {
            message.To.Add(new System.Net.Mail.MailAddress(BCCAddresses[i]));
        }
        message.IsBodyHtml = true;
        message.BodyEncoding = Encoding.UTF8;
        message.Subject = vm.Subject; 
        message.Body = vm.Body;

        for (int i = 0; i < Request.Files.Count; i++)
        {
            HttpPostedFileBase file = Request.Files[i];
            message.Attachments.Add(new Attachment(file.InputStream, file.FileName));
        }

        System.Net.Mail.SmtpClient client = new System.Net.Mail.SmtpClient();
        client.Send(message);

        return RedirectToAction("MassEmail");
    }

次は私のビューのコードです

@model TRIOSoftware.WebUI.Models.MassEmailViewModel

@{
    ViewBag.Title = "MassEmail";
}

@using (Html.BeginForm())
{
    <h1 class="align-right">Mass E-Mail</h1>

    <br />
    <br />

 <div>
<div class="editor-label" style="float:left; width:90px">
    From
</div>
<div class="editor-field" style="float:left">
    @Html.DropDownListFor(model => model.EmailFromAddressID,   
((IEnumerable<TRIOSoftware.Domain.Entities.EmailFromAddress>)
ViewBag.PossibleFromAddresses).OrderBy(m => m.Description).Select(option => new 
SelectListItem
{
   Text = option.Description.ToString(),
   Value = option.ID.ToString(),
   Selected = (Model != null) && (option.ID == Model.EmailFromAddressID)
}), "Choose...")  
</div>
</div>

<div class= "TagitEmailAddress" style="width:100%">
<div class="editor-label" style="float:left; clear:left;  width:90px">
    To
</div>
<div class="editor-field" style="float:left; width:88%">
    @Html.TextBoxFor(model => model.ToAddresses, new { @class = "TagTextBox" })
</div>
</div>

<div class= "TagitEmailAddress" style="width:100%">
<div class="editor-label" style="float:left; clear:left; width:90px">
    CC
</div>
<div class="editor-field" style="float:left; width:88%">
    @Html.TextBoxFor(model => model.CCAddresses, new { @class = "TagTextBox" })
</div>
</div>

<div class= "TagitEmailAddress" style="width:100%">
<div class="editor-label" style="float:left; clear:left; width:90px">
    <input type="button" id="BCC" value="BCC" class="btn"/>
</div>
<div class="editor-field" style="float:left; width:88%">
    @Html.TextBoxFor(model => model.BCCAddresses, new { @class = "TagTextBox" })
</div>
</div>

<div style="width:100%">
<div style="float:left; clear:left; width:90px">
    <input type="button" id="Subject" value="Subject" class="btn"/>
</div>
<div style="float:left; width:88%">
    @Html.TextBoxFor(model => model.Subject, new { id = "SubjectText", style =  
    "width:100%" })
</div>
</div>

<div style="width:100%">
<div style="clear:left; float:left; width:100%;">
    <div class="editor-field" style="float:left; width:100%;">
        @Html.TextAreaFor(model => model.Body, new { id = "BodyText" })
    </div>
</div>
</div>

<br />
<br />
<br />

<p style="clear:both">
    <input type="submit" value="Send E-Mail" class="btn btn-primary"/>
</p>

<div id="DefaultEmailText">
<div class="editor-label" style="float:left; width:150px">
    E-Mail Template
</div>
<div class="editor-field" style="float:left; padding-left:10px">
    @Html.DropDownList("EmailTemplate",  
   ((IEnumerable<TRIOSoftware.Domain.Entities.EmailTemplate>)
   ViewBag.PossibleTemplates).Select(option => new SelectListItem
   {
       Text = option.Description,
       Value = option.ID.ToString(),
       Selected = false
   }), "Choose...", new { ID = "Template", style = "width:200px" })    
</div>
</div>
}

@section sidemenu {
    @Html.Action("EmailsSideMenu", "Admin")
}

<script type="text/javascript">
var TemplateSubject = "";
var TemplateBody = "";

$(document).ready(function () {

    $('#attach').MultiFile({
        STRING: {
            remove: '<i style="color:Red" class="icon-remove-sign"></i>'
        }
    }); 

    $(".TagTextBox").tagit();

    $("#BodyText").cleditor({
        width: 800,
        height: 400
    });

    $("#DefaultEmailText").dialog({
        autoOpen: false,
        height: 150,
        width: 250,
        title: "Default Subject / Body",
        modal: true,
        buttons: {
            OK: function () {
                var selectedTemplate = $("#DefaultEmailText #Template").val();
                if (selectedTemplate != null && selectedTemplate != '') {
                    $.getJSON('@Url.Action("GetTemplate", "EmailTemplates")', { id: 
                      selectedTemplate }, function (template) {
                        $("#SubjectText").val(template[0].Subject);
                        $("#BodyText").val(template[0].Body).blur(); 
                    });
                }
                $(this).dialog("close");
            },
            Cancel: function () {
                $(this).dialog("close");
            }
        }
    });

    $('#Subject').click(function () {
        $("#DefaultEmailText").dialog("open");
    });


});

</script>

送信すると、ビューのロード時にtiがデフォルトで1に設定されていても、EmailFromAddressIDが0である以外は、すべてnull値を取得します。

何か案は?

EDIT_ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ _ ChromeのDevConsoleを調べたところ、ネットワークの下で投稿リクエストが表示されました。以下はそれに含まれる詳細な情報です。データがサーバーに送信されたように見えるので、サーバーがModelクラスに入力できない理由がわかりません。

Request URL:http://localhost:53730/Customers/MassEmail
Request Headersview source
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Content-Type:application/x-www-form-urlencoded
Origin:http://localhost:53730
Referer:http://localhost:53730/Customers/MassEmail
User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.17 (KHTML, like Gecko) 
Chrome/24.0.1312.52 Safari/537.17

Form Dataview sourceview URL encoded
EmailFromAddressID:1
ToAddresses:
CCAddresses:bclairmont@harrisworld.com
BCCAddresses:adunn@harrisworld.com,bclairmont@harrisworld.com,
bkelly@harrisworld.com,bhackett@harrisworld.com,jwade@harrisworld.com,
krichter@harrisworld.com,mroy-waters@harrisworld.com,
nburckhard@harrisworld.com,rlibby@harrisworld.com
Subject:Testing
Body:

これは、役立つ場合にclienttoサーバーとの間でやり取りされるクラスです。

public class MassEmailViewModel
{
    //public MassEmailViewModel()
    //{
    //    ComplexQuery = new CustomerQueryViewModel(); 
    //}

    public int EmailFromAddressID;

   // public CustomerQueryViewModel ComplexQuery;

    public string ToAddresses;
    public string CCAddresses;
    public string BCCAddresses;
    public string Subject;
    public string Body;
    //public string Attachments;
}
4

2 に答える 2

0

1) モデルが送信されるコントローラーのルートを指定しようとしましたか?. つまり、次のようにフォームを宣言します。

@using (Html.BeginForm("YourAction","YourController", FormMethod.Post))

2) 厳密に型指定されたビューを返す単純な「Get」アクションと、ビューに追加した情報を含む同じモデルを受け取る「Post」アクションを作成しないでください。作業が完了したら、コードを追加して、問題のトラブルシューティングを簡単に行うことができます。

3) すべてのヘルパーがフォーム内にあることを確認します。

4) 投稿を別のエリア、コントローラー、またはアクションにリダイレクトできるルーティング ルールを構成しましたか?

于 2013-01-18T23:14:16.280 に答える
0

パブリック フィールドではなく、パブリックプロパティDefaultModelBinderが必要です。

フィールドをプロパティに変更すると、機能するはずです。

public class MassEmailViewModel
{
    public int EmailFromAddressID { get; set; }

    public string ToAddresses { get; set; }
    public string CCAddresses { get; set; }
    public string BCCAddresses { get; set; }
    public string Subject { get; set; }
    public string Body { get; set; }
}
于 2013-01-19T06:30:50.337 に答える