在另一个控制器asp.mvc中访问动作方法的最佳解决方案是什么?

时间:2015-06-09 23:17:33

标签: asp.net-mvc

我有物品控制器和贷款控制器。我在系统中实现了qr代码功能,所以现在当用户进入特定项目的项目/细节时,会自动生成qr,并使用该特定项目的编码URL(Items / Details / id .. 接下来我想要的是当用户被重定向到一个项目的URL时,可以选择" loan"它......"创造新贷款"动作方法放在LoansController中,所以我想知道如何最好地解决问题..? 到目前为止,我所尝试的只是复制/粘贴该操作方法"创建新贷款"来自Items控制器中的LoansController,并在创建新贷款时将id设置为ItemId属性的参数。 但是在我这样做之后,当用户点击一个按钮"贷款"请求进入"创建新贷款" GET请求的动作方法在" ItemsController"然后抛出异常,它是类型为Loan的预期模型而不是Item类型的模型。 我在脑海中想到的另一件事是在LoansController中设置新贷款的重载版本,以便决定何时请求从Loan Controller创建新贷款的正常请求,或者来自具有特定ID的项目/详细信息项目..

我真的希望描述我想要发生的事情: 目前用户可以进入LoansController并使用Create new Loan功能,他可以通过下拉菜单选择哪个项目。 所需的功能是当用户使用qr并被重定向到特定项目页面的项目/详细信息/ id时,可以选择"贷款"它。 新贷款行动方法获得要求:

public ActionResult CreateLoan(int? id)
{
    if (id == null)
    {
        return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
    }

    Item item = db.Items.Find(id);

    if (item == null)
    {
        return HttpNotFound();
    }

    // ViewBag.UserID = new SelectList(db.AspNetUsers, "Id", "Email");
    //ViewBag.ItemID = new T(db.Items.Where(x => x.State == true), "ItemID", "Name");

    //return RedirectToAction("CreateLoan", "Items", id);
    return View(id);
}

和post req。的相同方法:

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult CreateLoan([Bind(Include = "LoanID,ItemID,UserID,DateOut,DateDue,ReturnDate")] Loan loan, int? id)
{
    if (ModelState.IsValid)
    {
        Item item = db.Items.Find(id);
        loan.ItemID = (item.ItemID);
        loan.UserID = User.Identity.GetUserId();
        loan.DateOut = DateTime.Now;
        loan.DateDue = loan.DateOut.AddDays(14);

        db.Loans.Add(loan);

和get req之后调用的视图。以及请求抛出的地方..

@model WebApplication3.Models.Loan
@using Microsoft.AspNet.Identity
@using Microsoft.AspNet.Identity.EntityFramework
@using WebApplication3.Models;


@{
    ViewBag.Title = "CreateLoan";
}

<h2>Create Loan</h2>

<h3>Are you sure you want to create this loan?</h3>
<div>
    <h4>Loan</h4>
    <hr />
    <dl class="dl-horizontal">
        <dt>
            @Html.DisplayNameFor(model => model.DateOut)
        </dt>

        <dd>
            @Html.DisplayFor(model => model.DateOut)
        </dd>

        <dt>
            @Html.DisplayNameFor(model => model.DateDue)
        </dt>

        <dd>
            @Html.DisplayFor(model => model.DateDue)
        </dd>

        <dt>
            @Html.DisplayNameFor(model => model.ReturnDate)
        </dt>

        <dt>
            @Html.DisplayNameFor(model => model.AspNetUser.Email)
        </dt>

        <dd>
            @Html.DisplayFor(model => model.AspNetUser.Email)
        </dd>

        <dt>
            @Html.DisplayNameFor(model => model.Item.Name)
        </dt>

        <dd>
            @Html.DisplayFor(model => model.Item.Name)
        </dd>

    </dl>

   @using (Html.BeginForm())

        @Html.AntiForgeryToken()
         {
        <div class="form-actions no-color">
            <input type="submit" value="CreateLoan" class="btn btn-default" /> |
            @Html.ActionLink("CreateLoan", "CreateLoan")
        </div>
    }
</div>

提前谢谢

1 个答案:

答案 0 :(得分:0)

视图和控制器在MVC中是完全独立的。所以你可以从任何视图调用任何控制器动作。 因此,从技术上讲,您可以从项目详细信息视图中调用贷款控制器操作,然后获取结果,甚至可以从那里重定向到新视图...... 因此,从“创建贷款”链接的“详细信息”视图中,您可以使用以下内容:

using PayPal.Api;

// Authenticate with PayPal and setup the APIContext object.
var config = ConfigManager.Instance.GetProperties();
var accessToken = new OAuthTokenCredential(config).GetAccessToken();
var apiContext = new APIContext(accessToken)
{
    Config = config
};

// Get the payment history
var paymentHistory = Payment.List(apiContext, count: 10, startIndex: 5);