MCV3 Entity Framework 4, код первый: редактирование нескольких почтовых сообщений пользователей - PullRequest
0 голосов
/ 21 марта 2012

Использование MVC3 с C # и Razor, а также EF4 с кодом в первую очередь для создания сайта, на котором вы можете создавать и манипулировать пользователями. Это очень просто, и есть только 2 типа объектов:

public class User
{
    [Key]        
    public int Id { get; set; }
    public string User_Name { get; set; }
    public string Password { get; set; }
    public string First_Name { get; set; }
    public string Last_Name { get; set; }

    public virtual ICollection<Email> Emails { get; set; }
}

public class Email
{
    [Key]
    public int Id { get; set; }
    public string Address { get; set; }
    public User User { get; set; }        
}

Отношение User / Email очевидно "один ко многим". Я настроил функции CRUD для объектов User, и они работают (в основном). Я хотел бы сделать страницу редактирования для пользователя, чтобы все его адреса электронной почты также можно было редактировать. (Я видел подобные посты к этому, они приблизили меня, но все еще не совсем там)

Мой Edit вид имеет рабочие редакторы для всех, кроме Emails, для которого у меня есть это:

<div class="editor-label">
    @Html.LabelFor(model => model.Emails):
</div>
<div class="editor-field">
    @Html.EditorFor(model => model.Emails)
    @Html.ValidationMessageFor(model => model.Emails)
</div>

Где @Html.EditorFor(model => model.Emails) добавляет ~/Views/Shared/EditorTemplates/Email.cshtml, который выглядит следующим образом:

@model LoginTest.Models.Email
@Html.HiddenFor(model => model.Id)

<div class="email-editor-field">
    @Html.EditorFor(model => model.Address)
    @Html.ValidationMessageFor(model => model.Address)
</div>

В результате получается визуализированная страница с текстовыми полями для каждого из адресов электронной почты пользователей, которая выглядит правильно, но не совсем работает. вот HTML:

<div class="editor-label">
    <label for="Emails">Email Address(es)</label>:
</div>

<div class="editor-field">

    <input data-val="true" data-val-number="The field Id must be a number." data-val-required="The Id field is required." id="Emails_0__Id" name="Emails[0].Id" type="hidden" value="1" />

    <div class="email-editor-field">
        <input class="text-box single-line" data-val="true" data-val-regex="Please enter a valid email address" data-val-regex-pattern=".+\@.+\..+" data-val-required="The Address field is required." id="Emails_0__Address" name="Emails[0].Address" type="text" value="benmiller86@gmail.com" />
        <span class="field-validation-valid" data-valmsg-for="Emails[0].Address" data-valmsg-replace="true"></span>
    </div>
    <br />

    <input data-val="true" data-val-number="The field Id must be a number." data-val-required="The Id field is required." id="Emails_1__Id" name="Emails[1].Id" type="hidden" value="2" />

    <div class="email-editor-field">
        <input class="text-box single-line" data-val="true" data-val-regex="Please enter a valid email address" data-val-regex-pattern=".+\@.+\..+" data-val-required="The Address field is required." id="Emails_1__Address" name="Emails[1].Address" type="text" value="benm@eras.co.uk" />
        <span class="field-validation-valid" data-valmsg-for="Emails[1].Address" data-valmsg-replace="true"></span>
    </div>
    <br />

    <span class="field-validation-valid" data-valmsg-for="Emails" data-valmsg-replace="true"></span>
</div>

Что опять же, я думал, выглядит правильно. Тем не мение! при отправке формы изменения в электронных письмах игнорируются. Я предполагаю, что что-то упустил из моего контроллера, поэтому я также опубликую это здесь:

[HttpPost]
public ActionResult Edit(int id, User User)
{
    try
    {
        db.Entry(User).State = EntityState.Modified;
        db.SaveChanges();

        return RedirectToAction("Index");
    }
    catch
    {
        return View();
    }
}

1 Ответ

1 голос
/ 22 марта 2012

Вы также должны установить состояние Email сущностей на Modified. Установка состояния пользовательского объекта не влияет на связанные объекты:

if (User.Emails != null)
    foreach (var email in User.Emails)
        db.Entry(email).State = EntityState.Modified;

db.Entry(User).State = EntityState.Modified;

Обратите внимание, что это не будет работать, если ваше представление позволит добавить или удалить электронное письмо для пользователя. Приведенный выше код подходит только для изменения электронных писем пользователя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...