0

これは私の最初のMVC3プロジェクトであり、これを達成するのは少し簡単だと思いましたが、多くの問題がありました。これは私が解決策に遭遇しなかった1つの問題のようです。最後の手段としてここに投稿します。

私の問題は、新しいレシピが作成されたときに、材料リストがデータベースに入力されていないように見えることです。残りのデータが保存されたときにコントローラーでリストをハードコーディングしようとしましたが、それでも何もしません。私の知る限り、DBには成分のフィールドすらありません。誰かが私が間違っていることを指摘できますか?どうもありがとう。

モデル:

public class Recipe
{
    public int ID { get; set; }

    [Required]
    public string Title { get; set; }

    [Required]
    [Display(Name = "Type of Meal")]
    public int TypeID { get; set; }

    [Required]
    public string Instructions { get; set; }

    [Display(Name = "Submitted By")]
    public string UserName { get; set; }

    public IList<string> Ingredients { get; set; }

    public virtual MealType Type { get; set; }
}

ビューの作成:

@model final.Models.Recipe

@{
    ViewBag.Title = "Recipe Finder - New Recipe";
}

<h2>New Recipe</h2>

<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>
<script type="text/javascript">
    //adds an ingredient field on the fly
    var numIngredients = 0;
    function addIngredient() {
        $('#ingredientlist').append('<tr><td><input type="text" name="Ingredients[' + numIngredients++ + ']" value="' + $('#AddIngredient').val() + '" readonly="true" tabindex="-1" /></tr></td>');

        $('#AddIngredient').val('');
        $('#AddIngredient').focus();
    }

    function onKeyPress(e) {
        var keycode;

        if (window.event) {
            keycode = window.event.keyCode;
        }
        else if (e) {
            keycode = e.which;
        }
        else {
            return true;
        }

        //for addingredient field, add ingredient and not submit
        //  else mimic submit
        if (keycode == 13) {
            if (document.activeElement.id == "AddIngredient") {
                addIngredient();
                return false;
            }
            document.getElementById('btnSubmit').click();
        }

        return true;
    }

    //intercepts form submit instead of using submit button to disable addingredient textbox
    //  this prevents the value/field from posting
    function preSubmit() {
        $('#AddIngredient').attr('disabled', 'true');
        document.getElementsByTagName('form')[0].submit();
    }

    //intercepts users pressing the enter key
    if (document.layers) document.captureEvents(Event.KEYPRESS);
    document.onkeypress = onKeyPress;
</script>

@using (Html.BeginForm()) {
    @Html.ValidationSummary(true)
<fieldset>
    <legend>by @User.Identity.Name</legend>

    <div class="editor-label">
        @Html.LabelFor(model => model.Title)
    </div>
    <div class="editor-field">
        @Html.EditorFor(model => model.Title)
        @Html.ValidationMessageFor(model => model.Title)
    </div>

    <div class="editor-label">
        @Html.LabelFor(model => model.TypeID, "Type")
    </div>
    <div class="editor-field">
        @Html.DropDownList("TypeID", String.Empty)
        @Html.ValidationMessageFor(model => model.TypeID)
    </div>

    <div class="editor-label">
        @Html.LabelFor(model => model.Ingredients)
    </div>
    <div class="editor-field">
        @Html.TextBox("AddIngredient")
        <input type="button" value="Add Ingredient" onclick="addIngredient()" tabindex="-1" />
        <table id="ingredientlist">
        </table>
    </div>

    <div class="editor-label">
        @Html.LabelFor(model => model.Instructions)
    </div>
    <div class="editor-field">
        @Html.TextAreaFor(model => model.Instructions, new { rows = "7", cols = "77" })
        @Html.ValidationMessageFor(model => model.Instructions)
    </div>

    @Html.HiddenFor(model => model.UserName)

    <p>
        <input type="button" value="Submit" onclick="preSubmit()" id="btnSubmit" />
    </p>
</fieldset>
}

コントローラ:

    [HttpPost]
    public ActionResult Create(Recipe recipe)
    {

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

        ViewBag.TypeID = new SelectList(db.MealTypes, "ID", "Type", recipe.TypeID);
        return View(recipe);
    }

私が見ることができるPOSTフィールドは、以下に示すように、すべての情報を正常に送信します。問題が何であるか、またはこの時点でまだ試していません。

Title:test recipe
TypeID:2
Ingredients[0]:test0
Ingredients[1]:test1
Ingredients[2]:test2
Ingredients[3]:test3
Instructions:this is a test
UserName:tym
4

1 に答える 1

1

エンティティに関連付けられた文字列のリストの保存については、このページを確認することをお勧めします。

于 2012-08-01T16:55:24.363 に答える