Как передать номер в маршруте через представление моему контроллеру - PullRequest
0 голосов
/ 05 марта 2011

Как передать число в маршруте через представление моему контроллеру

Я называю маршрут как

(localhost) / MyThing / Create / 3

То, что я хочу сделать, это использовать этот 3 параметр и установить его в объекте MyThing, когда я вставлю его в базу данных.

Я создал представление Edit, строго привязанное к моей вещи.Поэтому по умолчанию представление запрашивает у пользователя это значение (но я не хочу этого делать).

У меня есть эти методы в моем контроллере

public ActionResult Create()
{
    var thing= new MyThing();
    return View(thing);
}

и

 [HttpPost]
        public ActionResult Create(MyThing newThing, int thingID)
        {
            if (ModelState.IsValid)
            {
                try
                {
                    newThing.ThingID= thingID;
                    DB.MyThing .AddObject(newThing);
                    DB.SaveChanges();

                    return RedirectToAction("Index");
                }
                catch (Exception ex)
                {
                    ModelState.AddModelError("", "Error creating new Thing");
                }
            }
            return View(newThing);
        } 

Я пытался закомментировать код thingID в представлении, но я получаю ошибку, что он не может быть нулевым.Я также попытался изменить первый метод здесь, чтобы взять параметр и установить его при обновлении объекта, но маршрут сработал.

Если я использую код выше с представлением по умолчанию, число редактируемое и ноль наэкран.И когда вы возвращаетесь к контроллеру, параметр сбрасывается на 0.

Что было бы идеально для представления, чтобы получить это значение (3 в моем примере) и показать его, но только для чтения.Как мне это сделать?

Я использую ASP.net 2, если это имеет значение.

Ответы [ 2 ]

1 голос
/ 09 марта 2011

Я думаю, вы можете просто правильно настроить маршрут, и он будет проходить, когда вы звоните (localhost)/MyThing/Create/3

Итак, в вашем файле регистрации Global.asax или Area вам нужно сделать что-то вроде этого:

context.MapRoute("thing_route",
            "MyThing/Create/{thingID}",
            new
            {
                controller = "MyThing",
                action = "Create"
            }
        );
1 голос
/ 05 марта 2011

У вас есть проблема с вашим действием post, так как оно имеет параметр thingId дважды: один раз как свойство объекта MyThing и один раз как отдельный параметр, означающий, что следующая строка бесполезна, так как механизм связывания модели по умолчанию уже назначитсвойство:

newThing.ThingID = thingID;

Теперь, что касается вашего представления, вы не показывали его, но вы могли бы включить этот параметр id либо как часть формы, либо как скрытое поле.

Например:

<% using (Html.BeginForm(new { thingID = ViewContext.RouteData.Values["thingID"] })) { %>
    ...
<% } %>

И если вы хотите включить его в текстовое поле только для чтения:

<% using (Html.BeginForm()) { %>
    <%= Html.TextBoxFor(x => x.ThingId, new { @readonly = "readonly" }) %>
    ...
<% } %>

Наконец, ваше действие публикации станет:*

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