asp.net نشر نموذج مع طريقة عرض النموذج لطريقة عمل وحدة التحكم
-
21-12-2019 - |
سؤال
لدي نموذج معقد إلى حد ما وأحتاج إلى نشره على وحدة تحكم 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
@Html.CheckBoxFor(model => model[i].email)
Email
</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 الذي يبدو كما يلي:
كيف يمكنني جعل الخدمة ومعرف المستخدم خاليين؟
المحلول
لاحظ أنه في لامدا مساعديك، قل في 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
@Html.CheckBoxFor(model => model[i].email)
Email
</span>
</p>
}
لاحظ أن هذا يتطلب Model
ليكون من نوع التنفيذ IList
بدلا من IEnumerable
.
تحديث. بالنسبة للقيم الأخرى، التي لا تحتوي على أي واجهة مستخدم لها، يمكنك استخدام الحقول المخفية، بحيث لا تكون مرئية للمستخدم ومع ذلك يتم نشرها على الخادم:
<label>@Model[i].service.Name</label>
<span class="field">
@Html.CheckBoxFor(model => model[i].sms)
SMS
@Html.CheckBoxFor(model => model[i].email)
Email
@Html.HiddenFor(mode => model[i].userId)
@Html.HiddenFor(mode => model[i].service.Name)
...other field of service you want to be posted...
</span>