【问题标题】:How to import parameters from post method如何从 post 方法导入参数
【发布时间】:2018-01-12 04:52:02
【问题描述】:

如何通过post方法获取名为aidx参数的get方法? 当我从当前代码开始时,它说它没有定义。 aidx 是主键,我想将该主键分配给 Family 列。

<div id="blogpost" class="inner-content">

<form id="formdata"action="@Url.Action("Detail", "Board")" method="post" enctype="multipart/form-data">
    <section class="inner-section">
        <div class="main_blog text-center roomy-100">
            <div class="col-sm-8 col-sm-offset-2">
                <div class="head_title text-center">
                    <h2>@Html.DisplayTextFor(m => m.Article.Title)</h2>
                       @Html.HiddenFor(m => m.Article.ArticleIDX)
                    <div class="separator_auto"></div>
                    <div class="row">
                        <div class="col-md-8" style="margin-left:6%;">
                            <p>
                                <label>분 류  : </label>
                                @Html.DisplayTextFor(m => m.Article.Category)
                            </p>
                        </div>
                        <div class="col-md-8" style="margin-left:5%;">
                            <p>
                                <label>작성자  : </label>
                                @Html.DisplayTextFor(m => m.Article.Members.Name)
                            </p>
                        </div>
                        <div class="col-md-8" style="margin-left:10.6%;">
                            <p>
                                <label>작성일  : </label>
                                @Html.DisplayTextFor(m => m.Article.ModifyDate)
                            </p>
                        </div>
                    </div>
                </div>

                <div class="row">
                    <div class="col-md-12">
                        <p>
                            <label style="font-size:x-large;">문의내용</label>
                            <br />
                            <br />
                            @Html.DisplayTextFor(m => m.Article.Contents)
                            <br />
                            <br />
                            <br />
                            <br />
                        </p>
                    </div>
                </div>
                <div class="dividewhite2"></div>
                <p>
                    @if (User.Identity.IsAuthenticated == true)
                    {
                        <button type="button" class="btn btn-sm btn-lgr-str" onclick="btnEdit()">수정하기</button>
                        <button type="button" class="btn btn-sm btn-lgr-str" onclick="btnReply()">답글달기</button>
                    }
                    <button type="button" class="btn btn-sm btn-lgr-str" onclick="javascript:history.go(-1);">목록이동</button>
                    <br />
                    <br />
                    <br />
                    <br />

                </p>
                <div>
                    @Html.Partial("_Comment", new ViewDataDictionary { { "id", Model.Article.ArticleIDX } })
                    @Html.Partial("_CommentView", new ViewDataDictionary { { "CommentIDX", ViewBag.CommentIDX }, { "idx", Model.Article.ArticleIDX } })
                </div>
            </div>
        </div>
        <div class="dividewhite8"></div>
    </section>
</form>

<script >
function btnEdit() {

    if (@User.Identity.Name.Equals(Model.Article.Members.ID).ToString().ToLower() == true)
    {
        location.replace("/Board/Edit?aidx=@Model.Article.ArticleIDX");
    }
    else
    {
        alert("권한이 없습니다.");
    }
}

function btnReply() {
    location.replace("ReplyCreate?aidx=@Model.Article.ArticleIDX");
}

    [HttpGet]
        public ActionResult ReplyCreate(int aidx)
        {
        Articles articleReply = new Articles();
        return View(articleReply);
    }

    [HttpPost]
    public ActionResult ReplyCreate(Articles replyArticles, int aidx)
    {
        try
        {
            replyArticles.Family = aidx;
            replyArticles.ModifyDate = DateTime.Now;
            replyArticles.ModifyMemberID = User.Identity.Name;

            db.Articles.Add(replyArticles);
            db.SaveChanges();

            ViewBag.Result = "OK";
        }
        catch (Exception ex)
        {
            ViewBag.Result = "FAIL";
        }
        return View(replyArticles);
    }

【问题讨论】:

  • 你没有提交任何东西,你正在重定向页面。你不需要一个表单,而且可能一个简单的链接比按钮更好,所以你也不需要 JavaScript。最后,您的安全性非常糟糕,如果未通过身份验证,您将隐藏按钮,但每个人都可以看到 JavaScript 代码并复制并运行 URL。

标签: asp.net asp.net-mvc asp.net-mvc-5


【解决方案1】:

您的 HTML 和 JavaScript 有几个问题:

  1. 您没有提交任何内容,而是在 JavaScript 中重定向页面。

  2. 如果用户未通过身份验证,您将隐藏按钮,但每个人都可以从您的 JavaScript 中查看、复制和运行 URL。

  3. 即使您修复 #1 并且您的 ReplyCreate() 操作被调用,它也需要 2 个参数,但您只发送一个 (aidx)。另一个参数 (replyArticles) 将始终为 null

  4. 您的代码容易受到 CSRF 攻击。

要修复 #1,您可以将参数添加到表单而不是 JavaScript,并将按钮的类型更改为 submit

<form id="formdata"
 action="@Url.Action("Detail", "Board", null, new { aidx = Model.Article.ArticleIDX })"
 method="post" enctype="multipart/form-data">
    <div class="dividewhite2"></div>
    <p><button type="submit" class="btn btn-sm btn-lgr-str">답글달기</button></p>
</form>

或者您可以使用隐藏字段。

要修复 #2,请将检查移出表单并删除您的 JavaScript:

@if (User.Identity.IsAuthenticated) {
    <form id="formdata"
     action="@Url.Action("Detail", "Board", null, new { aidx = Model.Article.ArticleIDX })"
     method="post" enctype="multipart/form-data">
        <div class="dividewhite2"></div>
        <p><button type="submit" class="btn btn-sm btn-lgr-str">답글달기</button></p>
    </form>
}

要修复 #3,您必须将 replyArticles 参数添加到表单或作为隐藏字段。

要修复 #4,您需要将伪造检查添加到您的表单和操作中。

【讨论】:

  • 我再次上传了我的原始代码。您仍然容易受到攻击并需要更改按钮的类型吗?我想添加一个控制器来编写。我将在答案中添加一个功能。所以我想给控制器传参数。
  • 是的,您仍然容易受到攻击,您需要更改按钮的类型。
  • 我们当前查看的视图是详细视图。我可以在不保存的情况下更改按钮的类型吗?
  • 我明白了。那么,如果只是为了查看,为什么还需要一个表格呢?在这种情况下,请忽略我的回答。只需删除表格,您不需要它。并且您可以将按钮转换为链接,因此您不需要 JavaScript。或者,如果您真的愿意,也可以保留按钮。
  • 我正在创建公告板的回复功能。因此,如果您按下按钮,您必须转到可以写回复的窗口。所以你没有设置要提交的按钮类型。如何从详细视图中获取数据到控制器?
猜你喜欢
  • 2012-08-19
  • 1970-01-01
  • 1970-01-01
  • 2015-01-20
  • 2017-09-11
  • 2012-01-01
  • 2012-12-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多