保存模型,在模型(Saving a model within a model)

2019-07-31 06:05发布

所以,我有这个Property由定义的类ID NameDataTypeDataType已填充了静态值,而被用作一个下拉列表中。

现在,当用户拿起从列表一定值时, List值要精确,应用程序打开附加的文本框和按钮,用于填充该列表。

模型是这样的。

房产模型

public class Property
{
    public int ID {get; set;}
    public string Name {get; set;}

    public int DTypeID {get; set;}
    public virtual DType DTypes {get; set;}
}

列表模式

public class DList
{
    public int ID {get; set;}
    public int PropertyID {get; set;}
    public string ListValue {get; set;}
}

这是我到目前为止已经完成。

@using (Html.BeginForm()) {
    @Html.ValidationSummary(true)
    <fieldset>
        <div class="labels tableRow">
            <div class="editor-label tableCell">
                <p>
                    Name
                </p>
                <p>
                    Data Type
                </p>
            </div>
            <div class="editor-field tableCell">
                <p>
                    @Html.TextBoxFor(model => model.Name, new { @class = "textEntry" })
                    @Html.ValidationMessageFor(model => model.Name)
                </p>
                <p>
                    @Html.DropDownList("DTypeID", (SelectList)ViewBag.DTypeID, new { @class = "dropdown", @onchange = "DropDownChange()"})
                    @Html.ValidationMessageFor(model => model.DTypeID)
                </p>
            </div>
        </div>


        <div id="StaticListUI" class="invis">
            <div class="labels tableRow">
                <div class="editor-label tableCell">
                    <p>
                        @*here goes list*@
                    </p>
                </div>
                <div class="editor-field tableCell">
                    <p>
                        @*here goes textbox*@
                        @Html.TextBox("textboxList")
                    </p>
                    <p>
                        @*here goes button*@
                        <button name="button" value="add">Add</button>
                    </p>
                </div>

            </div>

        </div>


        <p class="labels">
            @*<input type="submit" value="Create" />*@
            <button name="button" value="create">Create</button> |
            <input type="button" value="Back" onClick='javascript:location.href = "@Url.Action("Index", "Property")";' />
        </p>
    </fieldset>
}

因此,为了获取点击的按钮我这样做是为我的控制器。

[HttpPost]
public ActionResult Create(string button, string textboxList, Property property)
{

    if (button == "add")
    {
        var lastProperty = db.Properties.OrderByDescending(p => p.PropertyID).FirstOrDefault();
        int propID;
        if (lastProperty == null)
        {
            propID = 1;
        }
        else
        {
            propID = 1 + lastProperty.PropertyID;
        }

        DList dList = new DList();

        dList.PropertyID = propID;
        dList.ListValue = textboxList;

        db.DLists.Add(dList);

        return View(property);
    }

    string projectID = System.Web.HttpContext.Current.Session["_SelectedProjectID"].ToString();
    int projID = Convert.ToInt32(projectID);
    property.ProjectID = projID;
    property.DateCreated = DateTime.Now;
    property.DateEdited = DateTime.Now;

    if (ModelState.IsValid)
    {
        db.Properties.Add(property);
        db.SaveChanges();
        return RedirectToAction("Index");
    }

    ViewBag.DTypeID = new SelectList(db.DType, "ID", "Name", property.DTypeID);
    return View(property);
}

而问题是,当我点击Add按钮,它仍然将一查ModelState.IsValid ,这不应该。 我做了什么错了,还是我做任何事情的权利:(

注:其他的一切基本工作原理。

编辑

所以,我改变了从控制器按钮,点击不同的接受参数。 但仍缺少的东西...

    [ActionName("Create")]
    [AcceptVerbs(HttpVerbs.Post)]
    [AcceptParameter(Name = "button", Value = "add")]
    public ActionResult Create_Add(string textboxList)
    {
        var lastProperty = db.Properties.OrderByDescending(p => p.PropertyID).FirstOrDefault();
        int propID;
        if (lastProperty == null)
        {
            propID = 1;
        }
        else
        {
            propID = 1 + lastProperty.PropertyID;
        }

        DList dList = new DList();

        dList.PropertyID = propID;
        dList.ListValue = textboxList;

        db.DLists.Add(dList);
        db.SaveChanges();



        return View();
    }

    [AcceptVerbs(HttpVerbs.Post)]
    [AcceptParameter(Name="button", Value="create")]
    public ActionResult Create(Property property)
    {
        string projectID = System.Web.HttpContext.Current.Session["_SelectedProjectID"].ToString();
        int projID = Convert.ToInt32(projectID);
        property.ProjectID = projID;
        property.DateCreated = DateTime.Now;
        property.DateEdited = DateTime.Now;

        if (ModelState.IsValid)
        {
            db.Properties.Add(property);
            db.SaveChanges();
            return RedirectToAction("Index");
        }

        ViewBag.DTypeID = new SelectList(db.DType, "ID", "Name", property.DTypeID);
        return View(property);
    }


    public class AcceptParameterAttribute : ActionMethodSelectorAttribute
    {
        public string Name { get; set; }
        public string Value { get; set; }

        public override bool IsValidForRequest(ControllerContext controllerContext, System.Reflection.MethodInfo methodInfo)
        {
            var req = controllerContext.RequestContext.HttpContext.Request;
            return req.Form[this.Name] == this.Value;
        }
    }

Answer 1:

你有db.DLists.Add(dList); 但千万不要把它保存在数据库中,你可以返回视图。 你可以把db.Configuration.ValidateOnSaveEnabled = false; 上述db.DLists.Add(dList); 并看看是否能工程,但我想应该是这样的:

db.Configuration.ValidateOnSaveEnabled = false;
db.DLists.Add(dList);
db.SaveChanges();
return View(property);

您可能要返回前关闭验证在救回来的。

更新也许你可以试试这个:

@{
    var textBoxData = form.find('input[name="textboxList"]').val();
}
<input type="button" value="Add"  title="Add"  onclick="location.href='@Url.Action("Create_Add", "Controller", new { textboxList = textBoxData })'" />


文章来源: Saving a model within a model