asp.net نشر نموذج مع طريقة عرض النموذج لطريقة عمل وحدة التحكم

StackOverflow https://stackoverflow.com//questions/22013590

سؤال

لدي نموذج معقد إلى حد ما وأحتاج إلى نشره على وحدة تحكم MVC الخاصة بي.

إليك نموذج العرض الذي أقوم بتمريره في البداية إلى طريقة العرض عند الإنشاء:

public class EditViewModel
{
    public Service service { get; set; }
    public bool sms { get; set; }
    public bool email { get; set; }
    public string userId { get; set; }
}

هذه هي وجهة نظري (مبسطة):

@model IList<Service_Monitor_Web_Interface.Models.ViewModels.EditViewModel>
@{
  ViewBag.Title = "Configure User Notifications";
  Layout = "~/Views/Shared/_Layout.cshtml";
}

<h2>@ViewBag.Title</h2>

@using (Html.BeginForm("Edit", "Users", FormMethod.Post, new { @class = "stdform stdform2", role = "form" }))
{
@Html.AntiForgeryToken()
<hr />

<p>
    <label><u> Service:</u> </label>
    <span class="field">
        <u>Notification Methods:</u>
    </span>
</p>


for (int i = 0; i < Model.Count; i++)
{
    <p>
        <label>@Model[i].service.Name</label>
        <span class="field">
            @Html.CheckBoxFor(model => model[i].sms)
            SMS &nbsp;&nbsp;
            @Html.CheckBoxFor(model => model[i].email)
            Email &nbsp;&nbsp;
        </span>
    </p>
}
<br clear="all" /><br />

<p class="stdformbutton">
    <button class="submit radius2">Save</button>
    <input type="reset" class="reset radius2" value="Reset Form" />
</p>
}

وهذه هي طريقة العمل الخاصة بي في وحدة التحكم الخاصة بي:

    //
    // POST: /Users/Edit
    [HttpPost]
    public ActionResult Edit(IList<EditViewModel> viewModel)
    {
        return View(viewModel);
    }

كيف يمكنني ربط نموذج العرض الخاص بي عند استلامه على وحدة التحكم؟حاليًا عندما أقوم بتصحيح الأخطاء، يتلقى أسلوب الإجراء ViewModel الذي يبدو كما يلي:

enter image description here

كيف يمكنني جعل الخدمة ومعرف المستخدم خاليين؟

هل كانت مفيدة؟

المحلول

لاحظ أنه في لامدا مساعديك، قل في model => service.sms الجزء الأيمن (service.sms) رسميًا غير مشتق من الجزء الأيسر (model).وهذا يسبب كل شيء name سمات المدخلات الناتجة هي نفسها، ويمنحك معلمات الطلب التي لم تكن تتوقعها.

الممارسة القياسية هي الاستخدام for بدلا من foreach في حالات الحلقة.بهذه الطريقة يتم إنشاء سمات الاسم لـ html الناتج بشكل صحيح:

for(int i=0; i<Model.Count; i++)
{
    <p>
        <label>@Model[i].service.Name</label>
        <span class="field">                
            @Html.CheckBoxFor(model => model[i].sms)
            SMS &nbsp;&nbsp;               
            @Html.CheckBoxFor(model => model[i].email)
            Email &nbsp;&nbsp;
        </span>
    </p>
}

لاحظ أن هذا يتطلب Model ليكون من نوع التنفيذ IList بدلا من IEnumerable.

تحديث. بالنسبة للقيم الأخرى، التي لا تحتوي على أي واجهة مستخدم لها، يمكنك استخدام الحقول المخفية، بحيث لا تكون مرئية للمستخدم ومع ذلك يتم نشرها على الخادم:

<label>@Model[i].service.Name</label>
<span class="field">                
    @Html.CheckBoxFor(model => model[i].sms)
    SMS &nbsp;&nbsp;               
    @Html.CheckBoxFor(model => model[i].email)
    Email &nbsp;&nbsp;
    @Html.HiddenFor(mode => model[i].userId)
    @Html.HiddenFor(mode => model[i].service.Name)
    ...other field of service you want to be posted...
</span>
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top