Меня интересует лучший способ справиться с отношениями внешних ключей при использовании ASP.NET MVC и Entity Framework.
В настоящее время я использую ViewModel для вывода страницы создания и редактирования (с использованием частичного), но когда я отправляю данные обратно, дела идут не очень хорошо.
Перед проверкой моей модели я использую опубликованное значение из списка выбора, чтобы найти посторонний объект и присвоить его моей модели, но когда я использую UpdateModel
при редактировании, ссылки оказываются нулевыми,Я предполагаю, потому что это не в состоянии связать это свойство правильно.
Как люди обычно решают эту проблему?Использование ViewModel для заполнения моих выпадающих списков кажется довольно простым, но я должен что-то упустить, когда дело доходит до редактирования.Люди обычно создают свои собственные подшивки, чтобы обойти эту проблему?
Я пробовал использовать строгую типизацию и FormCollection
.
ViewModel:
public class ReportViewModel
{
public Report Report { get; set; }
public SelectList ReportDeliveryMethods { get; set; }
public string ReportDeliveryMethod { get; set; }
public SelectList ReportReceivers { get; set; }
public string ReportReceiver { get; set; }
public SelectList PermitTypes { get; set; }
public string PermitType { get; set; }
}
Контроллер:
[HttpPost]
public ActionResult Edit(int id, FormCollection collection)
{
Report report;
try
{
report = repository.GetReport(id);
// Convert ReportDeliveryMethod to Object Reference
if (!string.IsNullOrEmpty(collection["ReportDeliveryMethod"]))
{
int reportDeliveryMethodId = 0;
if (int.TryParse(collection["ReportDeliveryMethod"], out reportDeliveryMethodId))
{
report.ReportDeliveryMethod = repository.GetReportDeliveryMethod(reportDeliveryMethodId);
}
}
// Convert ReportReceiver to Object Reference
if (!string.IsNullOrEmpty(collection["ReportReceiver"]))
{
int reportReceiverId = 0;
if (int.TryParse(collection["ReportReceiver"], out reportReceiverId))
{
report.ReportReceiver = repository.GetReportReceiver(reportReceiverId);
}
}
// Convert PermitType to Object Reference
if (!string.IsNullOrEmpty(collection["PermitType"]))
{
int permitTypeId = 0;
if (int.TryParse(collection["PermitType"], out permitTypeId))
{
report.PermitType = repository.GetPermitType(permitTypeId);
}
}
if (ModelState.IsValid)
{
UpdateModel(report);
repository.Save();
return RedirectToAction("Index");
}
else
{
return View();
}
}
catch (Exception ex)
{
return View();
}
}
Форма:
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<PermitLookup.Models.ReportViewModel>" %>
<% using (Html.BeginForm())
{%>
<%: Html.ValidationSummary(true) %>
<fieldset>
<legend>Fields</legend>
<div class="editor-label">
<%: Html.LabelFor(model => model.Report.ShareName) %>
</div>
<div class="editor-field">
<%: Html.TextBoxFor(model => model.Report.ShareName) %>
<%: Html.ValidationMessageFor(model => model.Report.ShareName)%>
</div>
<div class="editor-label">
<%: Html.LabelFor(model => model.Report.Description) %>
</div>
<div class="editor-field">
<%: Html.TextBoxFor(model => model.Report.Description)%>
<%: Html.ValidationMessageFor(model => model.Report.Description)%>
</div>
<div class="editor-label">
<%: Html.LabelFor(model => model.Report.Frequency)%>
</div>
<div class="editor-field">
<%: Html.TextBoxFor(model => model.Report.Frequency)%>
<%: Html.ValidationMessageFor(model => model.Report.Frequency)%>
</div>
<div class="editor-label">
<%: Html.LabelFor(model => model.Report.SendTime)%>
</div>
<div class="editor-field">
<%: Html.TextBoxFor(model => model.Report.SendTime)%>
<%: Html.ValidationMessageFor(model => model.Report.SendTime)%>
</div>
<div class="editor-label">
<%: Html.LabelFor(model => model.Report.ReportDeliveryMethod)%>
</div>
<div class="editor-field">
<%=Html.DropDownListFor(model => model.ReportDeliveryMethod, Model.ReportDeliveryMethods)%>
<%: Html.ValidationMessageFor(model => model.Report.ReportDeliveryMethod)%>
</div>
<div class="editor-label">
<%: Html.LabelFor(model => model.Report.ReportReceiver)%>
</div>
<div class="editor-field">
<%=Html.DropDownListFor(model => model.ReportReceiver, Model.ReportReceivers)%>
<%: Html.ValidationMessageFor(model => model.Report.ReportReceiver)%>
</div>
<div class="editor-label">
<%: Html.LabelFor(model => model.Report.PermitType)%>
</div>
<div class="editor-field">
<%=Html.DropDownListFor(model => model.PermitType, Model.PermitTypes)%>
<%: Html.ValidationMessageFor(model => model.Report.PermitType)%>
</div>
<p>
<input type="submit" value="Save" />
</p>
</fieldset>
<% } %>