【问题标题】:Unable to pass value to controller from view through viewmodel无法通过视图模型将值从视图传递给控制器
【发布时间】:2016-12-09 14:35:48
【问题描述】:

我很确定我的大脑是朋友,这是我明天早上要笑的事情,但不幸的是我被困在这部分并寻求帮助。

我有一个 ViewModel:

public class HousingDetailsViewModel : AppViewModel
{
    DataContext db = new DataContext();

    public List<string> units { get; set; }
    public List<AvailableHousing> availableHousings { get; set; }
    public Person person { get; set; }
    public OccupiedHousing currentHousing { get; set; }
    public OccupiedHousing newHousing;

    public HousingDetailsViewModel(int? id)
    {
            units = db.AvailableHousings.OrderBy(ah => ah.Unit).Select(h => h.Unit).Distinct().ToList();
            availableHousings = db.AvailableHousings.Where(h => h.Available == true).OrderBy(h => h.Bed)
                                                                                    .OrderBy(h => h.Room).ToList();
            currentHousing = db.OccupiedHousing.Include(o => o.AvailableHousing)
                                               .Include(o => o.Person).Where(o => o.PersonID == id && o.CurrentHousing == true).FirstOrDefault();
            person = db.Persons.Find(id);
            newHousing = new OccupiedHousing();
    }
}

这个视图的控制器方法:

public ActionResult Details(int? id)
{
    return View(new HousingDetailsViewModel(id));
}

[HttpPost]
public ActionResult Move(OccupiedHousing newHousing, int? personID)
{
    newHousing.PersonID = personID;
    newHousing.DateArrived = DateTime.Now;
    newHousing.CurrentHousing = true;
    newHousing.AvailableHousingID = housingID;
    db.OccupiedHousings.Add(newHousing);
    db.SaveChanges();


    return RedirectToAction("Index", new HousingViewModel());
}

我的表单对我的所有字段都很好,除了 1,这就是 AvailableHousingID。我试过设置一个隐藏的值。我在设置隐藏字段的值的地方放置了一个断点,我观察它的变化,但它没有到达控制器。所以我将其更改为表单提交并尝试将其作为路由值捕获,但这也不起作用。我很茫然,谁能看到我哪里出错了?

编辑:添加视图

@model AppName.ViewModels.HousingDetailsViewModel
@{
    ViewBag.Title = "Housing Details";
}

@Html.BeginForm("Move", "Housing", new { personID = @Model.person.ID }, FormMethod.Post, new { })
<script>
    function setID(id) {
        $('#HiddenHousingID').val(id);
        $('#HiddenSubmit').click();
    }
</script>
<h2>Housing Details</h2>

<div class="row">
    <div class="col-xs-12 container">
        <div class="col-xs-5">
            <img src="//placehold.it/150x200/77CCDD/66BBCC" class="img-responsive" />
        </div>
        <div class="col-xs-7">
            <h4>@Model.person.ComboName</h4>
            <h4>@Model.currentHousing.AvailableHousing.Unit - @Model.currentHousing.AvailableHousing.Room - @Model.currentHousing.AvailableHousing.Bed</h4>
            <h4>@Model.person.DateOfBirth.Value.ToShortDateString()</h4>
            @Html.HiddenFor(m => m.newHousing.AvailableHousingID, new { id = "HiddenHousingID", name = "newHousing.AvailableHousingID")}
        </div>
    </div>
</div>
<div class="row">
    @foreach (var unit in Model.units)
    {
        <div class="col-xs-6">
            <div class="panel panel-primary">
                <div class="panel-heading">
                    <span class="panel-title">
                        @unit
                    </span>
                </div>
                <div class="panel-body">
                    <table id="MoveHousingTable" class="table table table-condensed table-striped">
                        <thead>
                            <tr>
                                <th>
                                    Available Housing
                                </th>
                                <th></th>
                            </tr>
                        </thead>
                        <tbody>
                            @foreach (var housing in Model.availableHousings.Where(h => h.Unit == unit))
                            {
                                <tr>
                                    <td>
                                        @housing.Room -
                                        @housing.Bed
                                    </td>
                                    <td>
                                        <input type="button" value="Select" name="select" onclick="setID(@housing.ID)" />
                                    </td>
                                </tr>
                            }
                        </tbody>
                    </table>
                </div>
            </div>
        </div>
    }
</div>
<input type="submit" class="hidden" id="HiddenSubmit">
}

【问题讨论】:

  • 能不能也分享一下观点
  • (1) 视图模型不应该包含数据库访问代码 (2) 视图模型在编辑时不应该包含数据模型。 (3) 您将 HousingDetailsViewModel 传递给视图,因此您的 post 方法需要为 public ActionResult Move(HousingDetailsViewModel model) (4) 您似乎没有无参数构造函数,因此一旦您修复了第 3 点,DefaultModelBinder 将引发异常跨度>
  • @Usman,我已更新以显示视图。我展示了 BeginForm 的使用,其中我不使用 HousingID 参数作为 Move 方法。我想我应该把它从上面拿出来。
  • @StephenMuecke,感谢您提供的信息。我只是从 WebForms 迁移到 MVC,这就是我被指示的方式。现在我知道了,我将致力于将访问代码移动到模型中。但是,我确实将 Move 方法中的 OccupiedHousing 类型更改为 ViewModel,并向 ViewModel 添加了一个无参数构造函数,这是同样的问题。
  • 您的视图没有任何意义(您甚至没有任何可编辑的控件),但在 POST 方法中 model.newHousing.AvailableHousingID 将包含您脚本设置的值。

标签: c# asp.net-mvc


【解决方案1】:

路线:

@Html.BeginForm("Move", "Housing", new { personID = @Model.person.ID , housingID=  @Model.newHousing.AvailableHousingID}, FormMethod.Post, new { })

【讨论】:

  • 抱歉,忘记将 HousingID 参数从 Move 方法中取出。当我使用 hidden 时,我没有使用 hiddenfor 参数,至少我认为应该处理它。
  • 那么你应该遵循斯蒂芬的观点/想法——他的建议是正确的。 .
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多