1

したがって、 とPropertyで定義されるこのクラスがID NameありDataTypeます。 DataTypeすでに静的な値が入力されており、ドロップダウン リストとして使用されています。

ユーザーがリストから特定の値、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;
        }
    }
4

1 に答える 1

0

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);

戻る前に Validate On Save をオンに戻すことをお勧めします。

更新 おそらくこれを試すことができます:

@{
    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 })'" />
于 2012-08-29T11:34:23.913 に答える