0

データベースからドロップダウン リストを作成し、[HttpPost] で選択した項目のデータを使用するために、ビュー、コントローラー、およびビュー モデルを持つ MVC アプリケーションを実装しようとしています。以下は、対応する各ファイルのデータです。

MessageController.cs

public String send_url;
    private msg_cmsEntities smse = new msg_cmsEntities();
public ActionResult Message_Send_Get()
{

    var model = new MessageModel
    {
        MessagesList = smse.Messages
           .Select(c => new SelectListItem
           {
               Value = c.message1,
               Text = c.message1
           })
    };
    return View(model);            
}

[HttpPost]
    public ActionResult Message_Send_Get(String code, String password, String from, String Message_List, MessageModel message_to_send)
    {
        //If the Model is valid (no errors) then go into this statement
        if (ModelState.IsValid)
        {
            WebRequest wrGETURL;

        //This is a string that points to the location of the Web Service 
        string web_service_location = "http://www.google.com?";

        //This initates a new writeable instance of HttpValueCollection
        NameValueCollection query_string = System.Web.HttpUtility.ParseQueryString(string.Empty);
        //This builds up the query string that will be used for the redirect
        query_string["code"] = code;
        query_string["password"] = password;
        query_string["from"] = from;
        query_string["msg"] = Message_List;

        //This concatinates the web_service_location (String) and query_string (String)
        send_url = web_service_location + query_string.ToString();


        Debug.WriteLine(send_url);

        wrGETURL = WebRequest.Create(send_url);
    }
    var model = new MessageModel
    {
        MessagesList = smse.Messages
           .Select(c => new SelectListItem
           {
               Value = c.message1,
               Text = c.message1
           })
    };
    return View(message_to_send);
}

Message_Send_Get.aspx (ビュー):

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<Message_Send.Models.MessageModel>" %>

<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
    Message_Send_Get
</asp:Content>

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">

    <h2>Message_Send_Get</h2>

    <% using (Html.BeginForm()) {%>
        <%: Html.ValidationSummary(true) %>

        <fieldset>
            <legend>Fields</legend>

            <div class="editor-label">
                <%: Html.LabelFor(model => model.code) %>
            </div>
            <div class="editor-field">
                <%: Html.TextBoxFor(model => model.code) %>
                <%: Html.ValidationMessageFor(model => model.code) %>
            </div>

            <div class="editor-label">
                <%: Html.LabelFor(model => model.password) %>
            </div>
            <div class="editor-field">
                <%: Html.TextBoxFor(model => model.password) %>
                <%: Html.ValidationMessageFor(model => model.password) %>
            </div>

            <div class="editor-label">
                <%: Html.LabelFor(model => model.from) %>
            </div>
            <div class="editor-field">
                <%: Html.TextBoxFor(model => model.from) %>
                <%: Html.ValidationMessageFor(model => model.from) %>
            </div>

            <div class="editor-label">
                <%: Html.LabelFor(model => model.message) %>
            </div>
            <div class="editor-field">
                <%= Html.DropDownListFor(model => model.message, Model.MessagesList)%>
                <%: Html.ValidationMessageFor(model => model.message) %>
            </div>               

            <p>
                <input type="submit" value="Create" />
            </p>
        </fieldset>

    <% } %>

    <div>
        <%: Html.ActionLink("Back to List", "Index") %>
    </div>

</asp:Content>

MessageModels.cs

public class MessageModel
    {
        [Required(ErrorMessage = "You must enter a code for this service!!")]
        [DataType(DataType.Text)]
        [DisplayName("Code")]
        public string code { get; set; }

        [Required(ErrorMessage = "A password is required for the service!!")]
        [DataType(DataType.Text)]
        [DisplayName("Password")]
        public string password { get; set; }

        [Required(ErrorMessage = "You must enter the 'From' information!!")]
        [DataType(DataType.Text)]
        [DisplayName("Message From")]
        public string sms_from { get; set; }

        [Required]
        [DisplayName("Send Message")]
        public string message { get; set; }

        public IEnumerable<SelectListItem> MessagesList { get; set; }
    }

これを使用すると、タイトルにエラーが表示されます。誰か助けてもらえますか?

ありがとう

4

1 に答える 1

1

POSTコントローラーのアクションでは、何もしないモデル変数をインスタンス化しているようです。あなたはまだreturn View(message_to_send);、そしてもちろん、この変数にはそのプロパティが割り当てられmessage_to_sendていません。MessagesListまた、ビューモデルにすでに存在しているのに、なぜすべてのアクション引数を繰り返すのですか?

コードを改善することを提案する方法は次のとおりです(コードにコメントとしていくつかの警告を入れました):

[HttpPost]
public ActionResult Message_Send_Get(MessageModel message_to_send)
{
    if (ModelState.IsValid)
    {
        WebRequest wrGETURL;

        //This is a string that points to the location of the Web Service 
        string web_service_location = "http://www.google.com?";

        //This initates a new writeable instance of HttpValueCollection
        NameValueCollection query_string = System.Web.HttpUtility.ParseQueryString(string.Empty);
        //This builds up the query string that will be used for the redirect
        query_string["code"] = message_to_send.code;
        query_string["password"] = message_to_send.password;
        query_string["from"] = message_to_send.sms_from;

        // Warning: you seem to have used some Message_List argument in your action
        // but there's no corresponding input field in the view or in the model
        // maybe you want to add some
        // query_string["msg"] = message_to_send.sms_from.msg;

        //This concatinates the web_service_location (String) and query_string (String)
        send_url = web_service_location + query_string.ToString();

        Debug.WriteLine(send_url);

        // Warning: Here you only created the request but never sent it
        // I guess you will have to complete the code .....
        wrGETURL = WebRequest.Create(send_url);
    }

    // since we want to redisplay the same view we need to reassign the
    // MessagesList property used by the dropdown because in HTML a dropdown
    // sends only the selected value when the form is submitted and not the entire
    // list of options
    message_to_send.MessagesList = smse.Messages
       .Select(c => new SelectListItem
       {
           Value = c.message1,
           Text = c.message1
       });
    return View(message_to_send);
}

ちょっとした注意:あなたの見解では、あなたfromはあなたのモデルのいくつかのプロパティを使用しているようです:<%: Html.TextBoxFor(model => model.from) %>しかし、そのようなプロパティはあなたが示したモデルには存在しません。多分あなたは意味しsms_fromました。

于 2012-05-16T07:19:08.450 に答える