使用asp.net mvc 5

时间:2016-11-26 23:08:01

标签: c# razor asp.net-mvc-5

大家好!我是新来的,和其他人一样,是为了帮助我正在进行的一个小项目。

我在C#和Razor上的代码如下:应用程序的用户需要在先前存储在数据库中的配方中执行评级,其限制不能对配方进行多次评级。

没关系,但是需要将这个限制与评价配方的用户一起添加。我有一个列出所有用户的DropDown列表,可以提交到DB和所有用户,但我希望登录的用户提交表单,而不是其他任何人或“可选择”,这就是现在的工作方式。

我正在使用会话变量来获取用户的ID和一般信息,但我无法使其工作,因为外键与此相关,当我尝试手动检索它时,我只获得了ID (这是表中的外键),但需要显示谁在进行提交而不是ID,即使在HiddenFor中需要。

我该如何解决这个小问题?真的很感激任何帮助:)

来自recetastblController.cs的GET和POST方法

    // GET: recetastbl/Rate
    public ActionResult Rate(usuariostbl usuariostbl)
    {
        var puntuaciontbl = db.puntuaciontbl.Include(p => p.recetastbl).Include(p => p.usuariostbl);

        ViewBag.usuariostbl = Session["usuarioConectado"];
        ViewBag.usuariostbl_id = ViewBag.usuariostbl.id;
        ViewBag.usuariostbl.username = ViewBag.usuariostbl.username;

        ViewBag.usuariostbl_id = new SelectList(db.usuariostbl, "id", "username");
        ViewBag.recetastbl_id = new SelectList(db.recetastbl, "id", "receta");

        return View();
    }

    // POST: recetastbl/Rate
    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Rate([Bind(Include = "id,valoracion,usuariostbl_id,recetastbl_id")] puntuaciontbl puntuaciontbl)
    {
        if (ModelState.IsValid)
        {
            db.puntuaciontbl.Add(puntuaciontbl);
            db.SaveChanges();

            return RedirectToAction("Index");
        }

        ViewBag.usuariostbl_id = new SelectList(db.usuariostbl, "id", "username", puntuaciontbl.usuariostbl_id);
        ViewBag.recetastbl_id = new SelectList(db.recetastbl, "id", "receta", puntuaciontbl.recetastbl_id);

        return View("Index");
    }

完整视图Rate.cshtml

@model Prueba3Progra4.puntuaciontbl

@{
    ViewBag.Title = "Valorar Receta";
}

<h2>Valorar</h2>

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

<div class="form-horizontal">
    <h4>Receta</h4>
    <hr />
    @Html.ValidationSummary(true, "", new { @class = "text-danger" })
    <div class="form-group">
        @Html.LabelFor(model => model.valoracion, htmlAttributes: new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            1 Estrella
            @Html.RadioButtonFor(model => model.valoracion, "1", new { htmlAttributes = new { @class = "form-control" } })
            2 Estrellas
            @Html.RadioButtonFor(model => model.valoracion, "2", new { htmlAttributes = new { @class = "form-control" } })
            3 Estrellas
            @Html.RadioButtonFor(model => model.valoracion, "3", new { htmlAttributes = new { @class = "form-control" } })
            4 Estrellas
            @Html.RadioButtonFor(model => model.valoracion, "4", new { htmlAttributes = new { @class = "form-control" } })
            5 Estrellas
            @Html.RadioButtonFor(model => model.valoracion, "5", new { htmlAttributes = new { @class = "form-control" } })
            @Html.ValidationMessageFor(model => model.valoracion, "", new { @class = "text-danger" })
        </div>
    </div>

    <div class="form-group">
        @Html.LabelFor(model => model.usuariostbl_id, htmlAttributes: new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.DropDownList("usuariostbl_id", null, htmlAttributes: new { @class = "form-control" })
            @Html.ValidationMessageFor(model => model.usuariostbl_id, "", new { @class = "text-danger" })
        </div>
    </div>

    <div class="form-group">
        @Html.LabelFor(model => model.recetastbl_id, htmlAttributes: new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.DropDownList("recetastbl_id", null, htmlAttributes: new { @class = "form-control" })
            @Html.ValidationMessageFor(model => model.recetastbl_id, "", new { @class = "text-danger" })
        </div>
    </div>

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

<div>
    @Html.ActionLink("Volver a la Lista", "Index")
</div>

@section Scripts {
    @Scripts.Render("~/bundles/jqueryval")
}

1 个答案:

答案 0 :(得分:0)

ViewBag对象用于提供可以使用的视图数据。

对于get / post操作,从长远来看,将视图绑定到视图模型会好得多。例如:

视图模型:

    [AcceptVerbs(HttpVerbs.Get)]
    public ActionResult Rate()
    {
        return View(GetNewModel());
    }
    [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult Rate(usuarioConectado model)
    {
        ///
        /// When the user posts the form,
        /// the model parameter will have all
        /// of the values set in the 'get' method,
        /// along with the items selected.
        ///
        SaveModel(model);
        return View(GetNewModel());
    }
    private usuarioConectado GetNewModel()
    {
        return new usuarioConectado()
        {
            recetastbl_id_list = new List<string>() { "1", "2", "3" },
            usuariostbl_id_list = new List<string>() { "4", "5", "6" },
            valoracion = new List<string>() { "7", "8", "9" },
            username = "usuario1",
            usuariostbl_id = "1",
        };
    }
    private void SaveModel(usuarioConectado model)
    {
        //Save Stuff
    }

控制器:

@model MVCAnswers.Models.usuarioConectado


@{
    ViewBag.Title = "Ans40824091";
    Layout = "~/Views/Shared/_Default.cshtml";
}

<h2>Ans40824091</h2>

    @using (Html.BeginForm("Rate", "Ans40824091"))
    {
        <div class="form-group >
            @Html.LabelFor(model => model.usuariostbl_id_list, htmlAttributes: new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.DropDownListFor(model => model.usuariostbl_id_list, new SelectList(Model.usuariostbl_id_list, Model.usuariostbl_id_list), htmlAttributes: new { @class = "form-control" })
                @Html.ValidationMessageFor(model => model.usuariostbl_id, "", new { @class = "text-danger" })
            </div>
            @Html.LabelFor(model => model.recetastbl_id_list, htmlAttributes: new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.DropDownListFor(model => model.recetastbl_id_list, new SelectList(Model.recetastbl_id_list, Model.recetastbl_id_list), htmlAttributes: new { @class = "form-control" })
                @Html.ValidationMessageFor(model => model.recetastbl_id_list, "", new { @class = "text-danger" })
            </div>
            @Html.LabelFor(model => model.valoracion, htmlAttributes: new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.DropDownListFor(model => model.valoracion, new SelectList(Model.valoracion, Model.valoracion), htmlAttributes: new { @class = "form-control" })
                @Html.ValidationMessageFor(model => model.valoracion, "", new { @class = "text-danger" })
            </div>
            <h2>Hidden:</h2>
            <div class="col-md-10">
                @Html.Hidden("username", Model.username)
                @Html.Hidden("usuariostbl_id", Model.usuariostbl_id)
            </div>
            <input type="submit" name="submit" value="Submit" />
    }

观点:

String[] s = {"1","2","13","13a","10","10a","1a","1,"};

注意: 使用&#39;隐藏&#39;表单上的输入有一些安全风险。但是,如果您在http帖子上执行验证,风险应该非常小。