ASP.net使用会话数据在创建视图中添加内容

时间:2016-01-07 18:21:17

标签: c# asp.net asp.net-mvc-4 session

我创建了这个简单的ASP.NET项目。 (使用MVC的默认模板)

在那里,我使用ADO.net从我的数据库生成模型

我还为我的模型生成了控制器。 (该模型生成了用于创建,编辑,删除...的功能。)我还查看了控制器中的每个功能。

所以我现在要做的是:

- 我在创建视图中。 (这意味着我看到了用于创建对象的表单) - 我需要输入[title,content]的数据但是要在数据库中发帖我还需要一个id(这个id是外键,而不是我正在创建的对象的id)

我已经在会话中保存了此ID。我可以通过执行以下操作来访问会话数据:

    using System;
using System.Runtime.InteropServices;
using System.Text;
using NetFwTypeLib;
namespace WinFirewall
{
    public class FWCtrl
    {
        const string guidFWPolicy2 = "{E2B3C97F-6AE1-41AC-817A-F6F92166D7DD}";
        const string guidRWRule = "{2C5BC43E-3369-4C33-AB0C-BE9469677AF4}";
        static void Main(string[] args)
        {
            FWCtrl ctrl = new FWCtrl();
            ctrl.Setup();
        }
        public void Setup()
        {
            Type typeFWPolicy2 = Type.GetTypeFromCLSID(new Guid(guidFWPolicy2));
            Type typeFWRule = Type.GetTypeFromCLSID(new Guid(guidRWRule));
            INetFwPolicy2 fwPolicy2 = (INetFwPolicy2)Activator.CreateInstance(typeFWPolicy2);
            INetFwRule newRule = (INetFwRule)Activator.CreateInstance(typeFWRule);
            newRule.Name = "InBound_Rule";
            newRule.Description = "Block inbound traffic from 192.168.0.2 over TCP port 4000";
            newRule.Protocol = (int) NET_FW_IP_PROTOCOL_.NET_FW_IP_PROTOCOL_TCP;
            newRule.LocalPorts = "4000";
            newRule.RemoteAddress = "192.168.0.2";
            newRule.Direction = NET_FW_RULE_DIRECTION_.NET_FW_RULE_DIR_IN;
            newRule.Enabled = true;
            newRule.Grouping = "@firewallapi.dll,-23255";
            newRule.Profiles = fwPolicy2.CurrentProfileTypes;
            newRule.Action = NET_FW_ACTION_.NET_FW_ACTION_BLOCK;
            fwPolicy2.Rules.Add(newRule);
        }
    }
}

现在我想要的是在创建表单文本框中使用此ID。

截至目前,我视图中id的行看起来像这样(我不知道为什么它是一个下拉列表。当我打开网站时,我看到数据库中所有用户的名字,我可以选择一个。但这不是我想要什么。我只想看到一个):

var user = Session["user"] as Uporabniki; //returns session data
user.id //selects id from session

控制器中的create方法如下所示

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

如果我将视图更改为以下内容,为什么它不起作用:

// GET: Vprasanjas/Create
    public ActionResult Create()
    {
        ViewBag.id_avtorja = new SelectList(db.Uporabniki, "id", "uporabniskoIme");            
        return View();
    }

    // POST: Vprasanjas/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 = "id,naslov,vsebina,datum,id_avtorja")] Vprasanja vprasanja)
    {
        if (ModelState.IsValid)
        {
            db.Vprasanja.Add(vprasanja);
            db.SaveChanges();
            return RedirectToAction("Index");
        }

        ViewBag.id_avtorja = new SelectList(db.Uporabniki, "id", "uporabniskoIme", vprasanja.id_avtorja);
        return View(vprasanja);
    }

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

尝试重写

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create([Bind(Include = "id,naslov,vsebina,datum,id_avtorja")] Vprasanja vprasanja)
{
    if (ModelState.IsValid)
    {
        vprasanja.id = (Session["user"] as Uporabniki).id;
        db.Vprasanja.Add(vprasanja);
        db.SaveChanges();
        return RedirectToAction("Index");
    }

    ViewBag.id_avtorja = new SelectList(db.Uporabniki, "id", "uporabniskoIme", vprasanja.id_avtorja);
    return View(vprasanja);
}

主要想法 - 在帖子上指定您的ID。

答案 1 :(得分:0)

请发布有关错误的一些信息。但我的猜测是你没有创建任何输入HTML元素,所以没有任何帖子。您需要表单中的<input type="hidden" id="id_avtorja" value="@user.id">

另外,我建议不要使用会话变量中的数据。这是一种较旧的技术,在哲学上非常不具有MVC。