Редактирование / Создание объекта EF с внешними ключами - PullRequest
1 голос
/ 10 января 2011

Меня интересует лучший способ справиться с отношениями внешних ключей при использовании 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>
<% } %>

1 Ответ

1 голос
/ 10 января 2011

Давайте рассмотрим ReportDeliveryMethod.По вашему мнению модель, это string.На вашем Report объекте это ReportDeliveryMethod тип.Так как string не может быть неявно приведен к ReportDeliveryMethod, UpdateModel не будет связывать его.

Так что вы выбираете?

  1. Карта вручную,как вы делаете сейчас.
  2. Свяжите идентификатор, а не ссылку на объект.EF 4 поддерживает FK ассоциаций .Вы можете поставить ReportDeliveryMethodId в вашей модели представления вместо ReportDeliveryMethod.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...