HttpPost Edit Action для обновления моей модели - PullRequest
0 голосов
/ 18 марта 2011

Я пытаюсь создать приложение asp.net mvc3.

Вот мой взгляд:

@model Iads.Elrams.Data.Entities.Page
@using (Html.BeginForm()) {
    @Html.ValidationSummary(true)
    <div class="formElement">
            <div class="formFieldLabel">
                @Html.LabelFor(model => model.ExternalLink)
            </div>
            <div class="formField">
                @Html.TextBoxFor(model => model.ExternalLink, new { style = "width:400px" })
            </div>
        </div>
    <div class="border content">
        <div id="tabs" style="margin-top: 20px;"> <!-- jquery UI -->
            <div class="tabMenu"> 
                <ul>
                    @foreach (Iads.Elrams.Data.Entities.Language lang in ViewBag.Languages) {
                        <li><a href="#@lang.Iso2">@lang.Name</a></li>
                    }
                </ul>
            </div>
            @{
                foreach (Data.Entities.Language lang in ViewBag.AvailableLanguages) {
                    <div id="@lang.Iso2" class="border tabMenuContent">
                        <div class="formElement">
                            <div class="formFieldLabel">
                                @Html.LabelFor(model => model.GetTextOrDefaultByLang(lang.Iso2).Title) * <!-- Object: PageText -->
                            </div>
                            <div class="formField">
                                @Html.EditorFor(model => model.GetTextOrDefaultByLang(lang.Iso2).Title, new { style = "width:400px" })
                            </div>
                        </div>
                        <div class="formElement">
                            <div class="formFieldLabel">
                                @Html.LabelFor(model => model.GetTextOrDefaultByLang(lang.Iso2).NavText) *
                            </div>
                            <div class="formField">
                                @Html.EditorFor(model => model.GetTextOrDefaultByLang(lang.Iso2).NavText, new { style = "width:400px" })
                            </div>
                        </div>
                    </div>
                }
            }
        </div>
        <p>
            <input type="submit" value="save" class="button" />
            <input type="button" class="lightbutton" value="cancel" onclick="location.href = '@Url.RouteUrl(new RouteValueDictionary(new {
                    area = "Cms",
                    controller = "Page",
                    action = "Index"
                }))';" />
        </p>
    </div>
}

А вот мой контроллер страницы:


public ActionResult Edit(int id) {
    Page page = pageRepository.GetById(id);
    if(page == null)
        return new HttpNotFoundResult();

    IEnumerable languages = languageRepository.GetAll();
    languages = languages.OrderBy(m => m.LanguageId);
    ViewBag.AvailableLanguages = languages;
    return View(page);
}

[HttpPost]
public ActionResult Edit(what are the parameters???) {
    // ?????
    return View(page);
}

Я быхотел бы иметь страницу в качестве параметра, но это не работает с PageTexts !!

Каковы мои параметры?И как должен выглядеть мой метод?

Буду признателен за любую помощь.

спасибо!

Ответы [ 3 ]

0 голосов
/ 25 июля 2011
//
// GET: /controllername/Edit/
public ActionResult Edit()
{
    var langer = from lang in globalizationdb.langs select langs;
    ViewData["listlang"] = langer;
}

//
// POST: /controllername/Edit/
[HttpPost]
public ActionResult Edit(int id, FormCollection collection) {
                //dbcontext   //dbname            //id field
var languages = globalizationdb.lang.Where(x => x.lang_id == id).Single();

   long langish = Convert.ToInt64(collection["langfield"]);
   //get the lang id , im asuming u gonna use dropdownlist for lang...
   lang.lang_id = langish;

   //dbcontext 
   globalizationdb.SubmitChanges();
   return RedirectToAction("Index");
}

также на виде /// имя контроллера должно быть без Blabla "Controller" в конце, как CatController должен быть только Cat ..

@using (Html.BeginForm("Edit", "yourControllername", FormMethod.Post, new { enctype = "multipart/form-data" }))
{
    <div class="editor-label">Lang ID</div>
    <div class="editor-field">
        //lang field as dropdownlist
        @Html.DropDownList("langfield", new SelectList((System.Collections.IEnumerable)ViewData["listlang"], "lang_id", "lang_name",Model.lang))
        @Html.ValidationMessageFor(model => model.lang_id)
    </div>
}

после использования FormMethod.Post, new { enctype = "multipart/form-data" } при запуске формы вы можете использовать метод FormCollection.

Вы можете использовать это также для своих собственных созданных БД ..

0 голосов
/ 25 июля 2011

Вы можете использовать FormCollection и обрабатывать пары ключ-значение, но это не элегантное решение. Я бы порекомендовал использовать отдельный класс модели представления, отличный от вашего Iads.Elrams.Data.Entities.Page, тогда вы можете использовать библиотеку, такую ​​как AutoMapper, чтобы помочь вам отобразить значения. Модели представлений и модели вашей базы данных могут сильно различаться, вы можете получить большую гибкость, разрабатывая различные классы (проверка, пользовательская логика и т. Д.).

В вашем случае я бы создал класс PageViewModel, который содержит коллекцию класса PageLanguageViewModel. Кроме того, в представлении я использовал бы цикл for (i = 0; ...), чтобы методы расширения ввода html создавали соответствующие имена и идентификаторы для этой коллекции. И ваш параметр post будет экземпляром класса PageViewModel. Привязка модели ASP.NET Mvc работает и для типов коллекций. Однако при удалении или добавлении элементов в представление есть хитрость, поскольку необходимо поддерживать правильный индекс.

0 голосов
/ 18 марта 2011

Я думаю, что в вашем случае вы бы сделали параметр Iads.Elrams.Data.Entities.Page.Вы также можете сделать это FormCollection и таким образом получить элементы запроса.

Вот несколько методов типа обновления, которые я сделал:

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