ASP MVC Внешний ключ Отправить задачу - PullRequest
3 голосов
/ 14 ноября 2009

У меня есть две таблицы «Пользователи» и «Расходы» в бэкэнде. UserId - это внешний ключ для таблицы расходов. Мне нужно передать UserId из Usercontroller в ExpenseController, чтобы сохранить информацию о расходах против идентификатора пользователя. Но есть две проблемы.

  1. Я не могу использовать параметр id, который передается контроллеру расходов
  2. Еще одна форма для создания расходов, я не смог найти ни одного поля userId в форма, против которой я собираюсь сэкономить. Так что всегда есть modelstate.isvalid == false.

Пожалуйста, посмотрите на следующий код. Надеюсь, ты сможешь мне помочь.

// UserController

public ActionResult Index()
{
    return View(db.Users.ToList());
}

// Просмотр Inedx (пользователь)

<%= Html.ActionLink("Expenses", "Index", "Expense", new { id=item.Id}, null)%>

// ExpenseController

public ActionResult Index(int id)
{
    ViewData["id"] = id;
    return View(db.Expenses.Where(x => x.Users.Id == id).ToList());
}

// индексный вид (расходы)

<%= Html.ActionLink("Create New", "Create", new { id=ViewData["id"]})%>

// Контроллер расходов (Создать)

    public ActionResult Create(int id)
    {
        //ViewData["id"] = id;
        return View();
    } 

// Создать представление

<% using (Html.BeginForm()) {%>

    <fieldset>
        <legend>Fields</legend>

        <p>
            <label for="ExpenseTitle">ExpenseTitle:</label>
            <%= Html.TextBox("ExpenseTitle") %>
            <%= Html.ValidationMessage("ExpenseTitle", "*") %>
        </p>
        <p>
            <label for="ExpenseDescription">ExpenseDescription:</label>
            <%= Html.TextBox("ExpenseDescription") %>
            <%= Html.ValidationMessage("ExpenseDescription", "*") %>
        </p>
        <p>
            <label for="Date">Date:</label>
            <%= Html.TextBox("Date") %>
            <%= Html.ValidationMessage("Date", "*") %>
        </p>
        <p>
            <label for="Expense">Expense:</label>
            <%= Html.TextBox("Expense") %>
            <%= Html.ValidationMessage("Expense", "*") %>
        </p>
        <p>
            <input type="submit" value="Create" />
        </p>
    </fieldset>

<% } %>

// Создать сообщение

[AcceptVerbs(HttpVerbs.Post)]
    public ActionResult Create(FormCollection collection)
    {
        var expense = new Expenses();
        try
        {
            TryUpdateModel(expense, new string[] {"UserId", "ExpenseTitle", "ExpenseDescription", "Date", "Expense" }, collection.ToValueProvider());

                if (ModelState.IsValid)
                {
                    db.AddToExpenses(expense);
                    db.SaveChanges();
                    return RedirectToAction("Index",int.Parse(collection["UserId"]));
                }
                else {
                    return View(expense);
                }


            }
            catch
            {
                return View(expense);
            }
        }

1 Ответ

7 голосов
/ 14 ноября 2009

Я полагаю, что единодушный правильный способ сделать это состоит в том, чтобы создать конкретные модели для каждого представления и заполнить эту модель данными, необходимыми для представления, включая данные, которые могут быть необходимы для любых действий, которые просмотр вызывает. Так, например, у вас будет модель расходов, которую будет принимать ваше представление Create, одной из вещей, которую он будет содержать, будет связанный идентификатор пользователя для расходов. Действие Create, которое обрабатывает публикацию, будет принимать модель расходов вместо FormCollection в качестве параметра. В вашем представлении создания вы бы сохраняли идентификатор пользователя из модели в скрытом поле, чтобы его значение передавалось вместе с постом.

[AcceptVerbs( HttpVerbs.Get )]
public ActionResult Create(int id)
{
    return View( new ExpenseModel { UserId = id } );
}

[AcceptVerbs( HttpVerbs.Post )]
public ActionResult Create( ExpenseModel expense )
{
  ...
}

View

... Inherits="System.Mvc.ViewPage<ExpenseModel>" %>

<% using (Html.BeginForm()) { %>

    <%= Html.Hidden( "UserId" ) %>

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