Обнуляемое значение в Edit Action - PullRequest
1 голос
/ 18 ноября 2011

У меня есть форма редактирования, и у меня возникла проблема при сохранении результата.

Вид:

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

Модель:

namespace Restauracja.Models
{
     public class pracownikModel 
    {
         public LoginModel LoginModel { get; set; }
         public uzytkownikModel uzytkownikModle { get; set; }
       public pracownikModel() {
           LoginModel = new LoginModel();
           uzytkownikModle = new uzytkownikModel();
       }
    }

    public class LoginModel 
    {
        [Required]
        public string Uzytkownik { get; set; }

        [Required]
        public string Haslo { get; set; }

        public string Konto { get; set; }

    }

    public class uzytkownikModel
    {
        [Required]
        public string imie { get; set; }

        ....

    }
}

Контроллер:

        [HttpGet]
        public ActionResult Edit(int LoginID)
        {

            pracownikModel prac = new pracownikModel();

            var pr = (from p in baza.Logowanies where LoginID == p.LoginID select p).First();

            prac.LoginModel.Uzytkownik = pr.Login;

            return View(prac);
        }

        [HttpPost]
        public ActionResult Edit(int LoginID, pracownikModel prac)
        {
            var xxx = (from z in baza.Logowanies where LoginID == z.LoginID select z).Single();

            xxx.Login = prac.LoginModel.Uzytkownik;
            baza.SubmitChanges();

            return RedirectToAction("Index", "Foo");

        }

Функция с [HttpGet] работает правильно, показывая результат из базы данных. Проблема со второй функцией ... prac является нулем ... Так что это не может работать, потому что я не могу записать ноль в базу данных. Я не знаю, как решить эту проблему.

1 Ответ

2 голосов
/ 18 ноября 2011

Я бы порекомендовал вам использовать только стандартные буквы и цифры ASCII при именовании переменных и классов.Привязка модели по умолчанию использует эти имена при попытке связать свойства из запроса POST.Кроме того, поскольку эти имена свойств используются в качестве атрибутов name и id элементов ввода в HTML, в результате получается недопустимый HTML в соответствии с спецификацией , которая гласит:

  • ID и NAMEтокены должны начинаться с буквы ([A-Za-z]) и могут сопровождаться любым количеством букв, цифр ([0-9]), дефисов ("-"), подчеркиваний ("_"), двоеточий (":") и точки (".").

Поэтому не следует использовать расширенные символы ASCII или Unicode, такие как ł и ż.Замените их соответствующими символами ASCII, и механизм связывания модели по умолчанию сможет исправить выборку значений.


ОБНОВЛЕНИЕ:

После просмотра примера кода, который вы отправили мне в редакторев данный момент у вас есть 3 формы:

@model Restauracja.Models.pracownikModel

@{
    ViewBag.Title = "Edit";
}

<h2>Edit</h2>

<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>

@using (Html.BeginForm()) {
    @Html.ValidationSummary(true)
    <fieldset>
        <legend>Edit</legend>

        <div class="editor-label">
            @Html.LabelFor(model => model.LoginModel.Uzytkownik)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.LoginModel.Uzytkownik)
            @Html.ValidationMessageFor(model => model.LoginModel.Uzytkownik)
        </div>
    </fieldset>
}

<table id="nostyle">
<tr>
    <td>
        @using (Html.BeginForm())
        {
            @Html.ValidationSummary(true)
            <input type="submit" value="Save" />
        }
    </td>
    <td>
        @using (Html.BeginForm("Anuluj", "Pracownik", FormMethod.Post, new { id = "AnulujForm" }))
        {
            <input id="Anuluj" type="submit" value="Cancel" />
        }
    </td>
</tr>
</table>

Первая форма является единственной, которая содержит поля ввода для вашей модели.Таким образом, отправляя только первую форму, можно ожидать, что она заполнит некоторые свойства вашей модели в действии POST.К сожалению, эта первая форма не имеет кнопки отправки, поэтому вы не можете отправить ее.Вторая и третья формы содержат кнопки отправки, но они не содержат никаких полей ввода, поэтому отправка их оставит модель полностью пустой.

Итак, вам нужно переместить кнопку Сохранить отправку внутри первой формы:

@model Restauracja.Models.pracownikModel

@{
    ViewBag.Title = "Edit";
}

<h2>Edit</h2>

<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>

@using (Html.BeginForm()) 
{
    @Html.ValidationSummary(true)
    <fieldset>
        <legend>Edit</legend>

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

@:<table id="nostyle">
    @:<tr>
        @:<td>
            <input type="submit" value="Save" />
        @:</td>
}
        <td>
            @using (Html.BeginForm("Anuluj", "Pracownik", FormMethod.Post, new { id = "AnulujForm" }))
            {
                <input id="Anuluj" type="submit" value="Cancel" />
            }
        </td>
    </tr>
</table>

или поскольку кнопка «Отмена» отправляет текущее действие контроллера, тат выполняет перенаправление, вы можете просто заменить его привязкой, которая будет перенаправлять:

@using (Html.BeginForm()) 
{
    @Html.ValidationSummary(true)
    <fieldset>
        <legend>Edit</legend>

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

    <table id="nostyle">
        <tr>
            <td>
                <input type="submit" value="Save" />
            </td>
            <td>
                @Html.ActionLink("Cancel", "zarzadzaj_pracownikami", "Pracownik")
            </td>
        </tr>
    </table>
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...