POST 行动失去价值

POST Action Losing Values

我用 UseCaseIdExtensionPoint 的模型值填充我的视图 - 通过它进行调试似乎工作正常。

但是,当我向视图中的 ExtensionTitle 字段添加一点新信息,然后 POST 时,只有 ExtensionTitle 的值被保留,UseCaseIdExtensionPoint 丢失了。这意味着 if (ModelState.IsValid) returns false 因此我无法将新记录保存到数据库中。

谁能告诉我为什么在 POST 时这些值会丢失?

VIEWMODEL

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Web;

namespace JustSpecIt.ViewModels
{
    public class AddExtensionStepViewModel
    {

        public int UseCaseId { get; set; }
        [DisplayName ("Extends Step #")]
        public int ExtensionPoint { get; set; }
        [DisplayName ("Extends Step Description")]
        public string StepTitle { get; set; }
        [DisplayName("Extension Name")]
        public string ExtensionTitle { get; set; }

    }
}

型号

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace JustSpecIt.Models
{
    public class Extension
    {
        public int ID { get; set; }
        public int UseCaseID { get; set; }
        public string Title { get; set; }
        public int ExtensionPoint { get; set; }
    }
}

控制器

 // GET: Extensions/Create
        public ActionResult Create(int id)
        {
            ViewBag.UseCaseId = id;
            ViewBag.StepTitle = db.Steps.Find(id).Content;

            //Create an populate the ViewModel
            AddExtensionStepViewModel model = new AddExtensionStepViewModel()
            {
                ExtensionPoint = id,
                UseCaseId = db.Steps.Find(id).UseCaseID,


            };

            return View();
        }

        // POST: Extensions/Create
        // To protect from overposting attacks, please enable the specific properties you want to bind to, for 
        // more details see http://go.microsoft.com/fwlink/?LinkId=317598.
        [HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult Create([Bind(Include = "UseCaseId,ExtensionTitle,ExtensionPoint")] AddExtensionStepViewModel model)
        {
            if (ModelState.IsValid)
            {
                Extension e = new Extension ();
                e.ExtensionPoint = model.ExtensionPoint;
                e.UseCaseID = model.UseCaseId;
                e.Title = model.ExtensionTitle;

                db.Extensions.Add(e);
                db.SaveChanges();
                return RedirectToAction("ChooseExtensionStep", new { id = model.UseCaseId });
            }

            return View(model);
        }

VIEW

@model JustSpecIt.ViewModels.AddExtensionStepViewModel

@{
    ViewBag.Title = "Create";
    Layout = "~/Views/Shared/_Layout.cshtml";
}

<h2>Add Extension Step</h2>


@using (Html.BeginForm()) 
{
    @Html.AntiForgeryToken()

    @Html.HiddenFor(model => model.UseCaseId)
    @Html.HiddenFor(model => model.ExtensionPoint)


    <div class="form-horizontal">
        <h4>Extension</h4>
        <hr />
        @Html.ValidationSummary(true, "", new { @class = "text-danger" })





        <div class="form-group">
            @Html.LabelFor(model => model.ExtensionTitle, htmlAttributes: new { @class = "control-label col-md-4" })
            <div class="col-md-10">
                @Html.EditorFor(model => model.ExtensionTitle, new { htmlAttributes = new { @class = "form-control form-control-no-max-width" } })
                @Html.ValidationMessageFor(model => model.ExtensionTitle, "", new { @class = "text-danger" })
            </div>
        </div>

        <div class="form-group">
            <div class="col-md-offset-2 col-md-10">
                <input type="submit" value="Create" class="btn btn-default" />
            </div>
        </div>
    </div>
}

您没有在 GET 方法中将模型传递给视图(因此 UseCaseIDTitle 的值是 0int 的默认值)

public ActionResult Create(int id)
{
  ViewBag.UseCaseId = id;
  ViewBag.StepTitle = db.Steps.Find(id).Content;
  AddExtensionStepViewModel model = new AddExtensionStepViewModel()
  {
    ExtensionPoint = id,
    UseCaseId = db.Steps.Find(id).UseCaseID,
  };
  return View(model); // change this
}