我创建了这个简单的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);
}
我该如何解决这个问题?
答案 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。